分配二维数组问题与分配额外的内存

时间:2011-03-23 11:19:58

标签: java android multidimensional-array memory-management

我在我的应用程序中跟踪分配,我在分配数组时出现了非常奇怪的行为。 这是我的代码的简单演示 -

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中,当我分配一维数组时,一切似乎都是正常的

  • 点击之前
    • 堆大小= 5.2 MB
    • 已分配= 2.6 MB
  • 点击后
    • 堆大小= 6.5
    • assigned = 3.9
  • 分配的对象
    • 56(分配) - 短[] - 在Main.java#OnClick
    • 中分配

在案例2中,当我分配二维数组时,事情正在发生

  • 点击之前
    • 堆大小= 5.2 MB
    • 已分配= 2.6 MB
  • 点击后
    • 堆大小= 8.1 MB
    • 已分配= 5.3 MB
  • 分配的对象
    • 36(分配) - short [] - 在Array.java中分配#createMultiArray
    • 24(分配) - short [] [] - 在Array.java中分配#createMultiArray
    • 24(分配) - int [] - 在Main.java#OnClick
    • 中分配

如果你检查统计数据,你会发现如果我使用的是2 dim数组,那么如果我使用的是1 dim数组,则分配的内存大约是两倍。似乎额外的内存用于分配int []。

有没有人清楚地知道为什么会这样?

1 个答案:

答案 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]