JVM堆内存为什么不建议超过32G?
当堆内存设置大于等于32G时。
- 指针压缩会关闭。
- 使用64位存储指针,浪费内存。
- 会浪费主存到缓存的带宽。
- 在full GC的时候可能会花费几分钟。
首先,JVM是8字节对齐
JVM在启动的时候可以指定一个参数-XX:ObjectAlignmentInBytes,来指定JVM是几个字节对齐,参数值是8的倍数,默认是8.
其次,JVM默认开启指针压缩
指针压缩默认是开启的-XX:-UseCompressedOops,即使在64位CPU中,JVM也会用32位存储指针,因为用64位存储指针会浪费主存到缓存的带宽,如果不使用指针压缩,32只能存4G的地址,堆的大小最大只能是4G。开启指针压缩之后,JVM每8位(因为是8字节对齐)取一个地址,因为是8字节对齐的地址1,2,3,4,5肯定都是同一个对象。这样32位的空间就能存4G*8=32G的对象。
当堆空间设置的大于或等于32G时,会关闭指针压缩,jvm就会使用64位来存储指针,浪费指针占用更多内存,还会浪费主存到CPU的缓存的带宽。
#Java#