为什么创建一个大型Java阵列会消耗如此多的内存?

时间:2010-09-15 15:10:37

标签: java arrays memory

为什么以下行

    Object[] objects = new Object[10000000];

导致JVM使用大量内存(~40M)?在分配数组时有没有办法知道VM的内部工作原理?

10 个答案:

答案 0 :(得分:22)

那么,它为10000000引用分配了足够的空间,以及数组对象本身的少量开销。

实际大小将取决于VM - 但它占用相当大的内存肯定不足为奇......我希望至少 40MB,而64位可能是80MB -bit VM,除非它对数组使用compressed oops

当然,如果用这么多不同的对象填充数组,那将需要更多,更多的内存......但是数组本身仍然只需要空间用于引用。

答案 1 :(得分:17)

“大量记忆”是什么意思?你分配10000000个指针,每个指针占用4个字节(在32位机器上) - 这大约是40mb的内存。

答案 2 :(得分:3)

您正在创建一千万个对象的引用。引用至少为4个字节; Java中的IIRC可能是8,但我不确定。

因此,使用这一行,您将创建40或80兆字节的数据。

答案 3 :(得分:3)

您正在为一千万个参考预留空间。那是相当多的。

答案 4 :(得分:3)

它导致使用大量内存,因为它需要为1000万个对象分配堆空间及其相关的开销。

要查看JVM的内部工作原理,您可以check out its source code,因为它是开源的。

答案 5 :(得分:3)

你的数组必须拥有1000万个对象引用,在现代平台上它们是64位(8字节)指针。由于它被分配为一个连续的存储块,因此它应该占用8000万字节。从某种意义上讲,这是很大的,与你可能拥有的内存量相比很小。为什么打扰你?

答案 6 :(得分:3)

它创建一个包含10.000.000个引用指针的数组,所有引用都用null初始化。

你有什么期望,说这是“很多”?


进一步阅读

答案 7 :(得分:2)

如此广泛使用数组的一个主要原因是它们的元素可以在恒定时间内访问。这意味着访问[i]所花费的时间对于每个索引i是相同的。这是因为可以通过向阵列头部的地址添加合适的偏移来算术地确定a [i]的地址。 原因是数组内容的空间被分配为连续的内存块。

答案 8 :(得分:2)

根据this站点,数组的内存使用量是12个字节的标头+每个元素4个字节。如果声明一个包含10M元素的Object空数组,那么从一开始就使用大约40MB的内存。如果你开始用实际的10M对象填充该数组,那么大小会非常快速地增加。

this站点,我刚刚在我的64位计算机上测试它,普通Object的大小约为31个字节,因此一个10M的Object数组是大约12字节+(4 + 31字节)* 10M = 350 000 012字节(或345.78 MB)

如果你的数组持有其他类型的对象,那么大小会更大。

如果您必须在程序中保留如此多的数据,我建议您使用某种随机存取文件来保存数据。甚至可以使用Apache Derby等数据库,这也可以让您对数据进行排序和过滤等。

答案 9 :(得分:0)

我可能落后于时代,但我从实用Java一书中了解到,矢量比阵列更有效,更快。是否可以使用Vector而不是数组?