实际的内存开销是什么?

时间:2016-10-12 06:58:13

标签: java memory-management jvm java-memory-model memory-overhead

我已阅读what-is-the-memory-consumption-of-an-object-in-javawhat-is-the-memory-overhead-of-an-object-in-java

但我仍然感到困惑。

  • 什么是内存开销?它是 padding
  • 压缩指针是什么JVM?是reference ??
  • 如果使用32-bit JVM,那么开销会减少吗?当然是。但是因为填充?
  • 为了提高内存效率或性能,最好始终使用32-bit JVM吗?

下图来自this link(第26页)

在这张图片中,它们显示为 16字节JVM开销,为什么会这样?

enter image description here

1 个答案:

答案 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,则必须添加此偏移量,这会产生轻微的开销。

堆大小:

  • < 4 GB - 零扩展地址
  • 4 - 28 GB - 乘以8或<< 3注意:x64有一条说明支持double[]long[]
  • 28 - 32 GB - 乘以8并添加一个保持偏移量的寄存器。稍慢,但通常不是问题。