java—包含1个元素的数组是否占用与该1个元素相同的内存量?

lx0bsm1f  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(298)

假设有一个 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数组骗局而占用更多的空间?

uoifb46i

uoifb46i1#

真有趣的问题!是-在java中,与数组相关联的数组开销大于24字节。
这是因为数组只是java中的对象。因此,标题、变量等添加到空间中。此外,在java中,对象需要填充到8字节。因为你的元素和数组都需要填充,所以需要更多的内存!
让开!对象填充:为什么java对象必须是8的倍数?
edit:找到了一个非常棒的资源@swe stackexchange为什么在java中分配对象/数组会增加开销?
答案在我写的东西上更深入。如果你想了解更多,你一定要去看看

bvpmtnay

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-如果你不明白这一点,你会得到一个不正确的数组心理模型和它们的工作方式。这很可能会导致代码中出现错误。

相关问题