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

Moj*_*sin 0 java android memory-management multidimensional-array

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

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];
        }
    }   
}
Run Code Online (Sandbox Code Playgroud)

我运行了两个测试用例,其中我评论了案例行.在案例1中,当我分配一维数组时,一切似乎都是正常的

  • 点击之前
    • 堆大小= 5.2 MB
    • 已分配= 2.6 MB
  • 点击后
    • 堆大小= 6.5
    • 已分配= 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 [].

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

Jon*_*eet 8

这个:

new short[2][10]
Run Code Online (Sandbox Code Playgroud)

正在创建三个对象.这是有效的:

short[][] tmp = new short[2][];
tmp[0] = new short[10];
tmp[1] = new short[10];
Run Code Online (Sandbox Code Playgroud)

鉴于每个对象的开销,它占用大约两倍的内存并不奇怪.你会看到这和(比如说)之间的差异较小

// case 1
new short[10000]
// case 2
new short[2][5000]
Run Code Online (Sandbox Code Playgroud)

但是下面会是可怕的,因为它会创建5000个short[]只有两个元素的数组,此时开销使实际的daa相形见绌.

new short[5000][2]
Run Code Online (Sandbox Code Playgroud)