gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:14:53 26 4
gpt4 key购买 nike

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

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
    • 已分配 = 3.9
  • 分配的对象
    • 56(分配) - 短[] - 在 Main.java#OnClick 中分配

在情况 2 中,当我分配二维数组存储时,事情正在发生

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

如果你检查统计数据,你会发现,如果我使用 2 个暗淡数组,则分配的内存大约是我使用 1 个暗淡数组时的两倍。看来额外的内存用于分配 int[]。

有人清楚为什么会发生这种情况吗?

最佳答案

这个:

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]

关于java - 分配二维数组分配额外内存的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5404435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com