我已阅读what-is-the-memory-consumption-of-an-object-in-java和what-is-the-memory-overhead-of-an-object-in-java。
但我仍然感到困惑。
padding
?JVM
?是reference
?? 32-bit JVM
,那么开销会减少吗?当然是。但是因为填充? 32-bit JVM
吗?下图来自this link(第26页)
在这张图片中,它们显示为 16字节JVM开销,为什么会这样?
答案 0 :(得分:8)
什么是内存开销?
当使用的内存多于您创建的字段时。
是填充物吗?
有些是填充,它可以出现在对象的任何地方,除了总是在开头的标题。标头长度通常为8-12个字节。
什么是带有压缩指针的JVM?
在64位JVM中使用32位指针来节省内存的技术。
是参考??
引用可以使用这种技术,但也可以指向对象的类信息。
如果使用32位JVM,那么开销会更少?
可能,虽然这与使用参考和类的压缩指针相同。
但这是因为填充吗?
这是因为64位指针使用的空间比32位指针多。
为了提高内存效率或性能,最好总是使用32位JVM吗?
不,32位处理器型号具有32位寄存器,其中64位型号具有两倍大小(64位)的寄存器,这意味着可以在最快的存储器中保存更多的寄存器,寄存器。使用64位处理模型时,64位计算也会更快。
一般情况下,我建议您始终使用64位JVM,除非a)不能或b)内存非常少。
在这个图像中,它们在启动时显示为16字节的JVM开销,为什么会这样呢?
这不是严格正确的。这假设您有一个非压缩类引用,因此标头是12字节,但默认情况下对象是8字节对齐,这意味着端将有4个字节的填充(总共16个字节)但并非一开始就是全部)
常见问题解答:为什么32位压缩OOP的地址超过4 GB
默认情况下,对象必须是8字节对齐的。这使内存管理更容易,但有时会浪费一些填充。副作用是每个对象的地址对于最低的三个比特将具有000(它必须是8的倍数)这些比特不需要存储。这允许压缩的oops处理8 * 4 GB或32 GB。
对于16字节的对象对齐,JVM可以使用32位引用来寻址64 GB(但是填充开销更高,可能不值得)
IFAQ:为什么它在28-32 GB
附近变慢虽然引用可以乘以8,但堆不会在内存开始时启动。它通常在4 GB后开始。这意味着如果您需要完整的32 GB,则必须添加此偏移量,这会产生轻微的开销。
堆大小:
<< 3
注意:x64有一条说明支持double[]
和long[]