我在我的应用程序中跟踪分配,我在分配数组时出现了非常奇怪的行为。 这是我的代码的简单演示 -
public class Main extends Activity implements OnClickListener {
private Object[][] m = new Object[30000][];
@Override
public void onCreate(Bundle savedInstance) {
setContentView(R.layout.main);
super.onCreate(savedInstance);
findViewById(R.id.Button01).setOnClickListener(this);
}
@Override
public void onClick(View v) {
for (int i = 0 ; i < 30000 ; i++) {
// case 1
m[i] = new short[20];
// case 2
m[i] = new short[2][10];
}
}
}
我运行两个测试用例,其中我评论了案例行。 在案例1中,当我分配一维数组时,一切似乎都是正常的
在案例2中,当我分配二维数组时,事情正在发生
如果你检查统计数据,你会发现如果我使用的是2 dim数组,那么如果我使用的是1 dim数组,则分配的内存大约是两倍。似乎额外的内存用于分配int []。
有没有人清楚地知道为什么会这样?
答案 0 :(得分:8)
此:
new short[2][10]
正在创建三个对象。这是有效的:
short[][] tmp = new short[2][];
tmp[0] = new short[10];
tmp[1] = new short[10];
考虑到每个对象的开销,它的内存大约是其两倍,这并不奇怪。你会发现这和(比如说)
之间的差别较小// case 1
new short[10000]
// case 2
new short[2][5000]
但是下面的内容会很糟糕,因为它会创建只有两个元素的5000个short[]
数组,此时开销会使实际的daa相形见绌。
new short[5000][2]