假设有一个 Cat
当一个新的 Cat
创建时,每次分配给它的内存量相同。现在看下面的代码:
Cat aSingleCat = new Cat(); // X amount of memory is allocated to 'aSingleCat'
Cat[] oneElmCatArray = new Cat[1];
oneElmCatArray[0] = new Cat(); // Same amount of memory is allocated to the only index of this 1-element array
这是什么意思?做 oneElmCatArray
占用的内存量与 aSingleCat
,还是因为一些幕后的java数组骗局而占用更多的空间?
2条答案
按热度按时间uoifb46i1#
真有趣的问题!是-在java中,与数组相关联的数组开销大于24字节。
这是因为数组只是java中的对象。因此,标题、变量等添加到空间中。此外,在java中,对象需要填充到8字节。因为你的元素和数组都需要填充,所以需要更多的内存!
让开!对象填充:为什么java对象必须是8的倍数?
edit:找到了一个非常棒的资源@swe stackexchange为什么在java中分配对象/数组会增加开销?
答案在我写的东西上更深入。如果你想了解更多,你一定要去看看
bvpmtnay2#
做
oneElmCatArray
占用的内存量与aSingleCat
,还是因为一些幕后的java数组骗局而占用更多的空间?答案是:视情况而定。
首先,重要的是你要明白
Cat[]
实际上包含。它不包含
Cat
物体。它实际上包含对
Cat
对象,或null
参考文献。在每种情况下,引用将占用4或8个字节,具体取决于jvm平台和(在某些情况下)命令行选项。
那么,a
Cat
占用的内存比Cat[1]
? 答案实际上取决于:引用的大小(见上文)
的示例字段的数目和类型
Cat
类。。。在你的问题中没有具体说明。在进行实际计算时,需要包括各个本机对象/数组头的大小(分别为8和12字节)。另外,考虑到jvm堆节点大小是8字节的倍数(但这些东西在理论上是依赖于实现的。)
最后,正如@louis wasserman指出的,答案还取决于你的“会计”规则。什么时候
Cat[]
包含对Cat
,你数了吗Cat
是否作为阵列的一部分?1-如果你不明白这一点,你会得到一个不正确的数组心理模型和它们的工作方式。这很可能会导致代码中出现错误。