Vin*_*han 8 java compression oop optimization
我能理解,使用压缩oops,我们只能使用32 GB的RAM.有没有什么可以通过分配2堆或其他什么来使用更多?
谢谢Vineeth
Tom*_*icz 20
你不能有多个堆(你可以拥有多个JVM,这称为扩展而不是扩展).
JVM使用压缩对象指针自动低于32 GiB的内存.如果你理解它是如何工作的(从每个地址中删除最小的三位,因为它们总是由于内存对齐而为0),你就会明白你不能再进一步了.
有一个有趣的事实:一旦超过这个32 GiB边界,JVM将停止使用压缩对象指针,从而有效地减少了可用内存.这意味着将JVM堆增加到32 GiB以上,你必须超越它.据我所知,关于JVM性能调优@twitter(大约13:00)的所有内容,将增量堆从32 GiB增加到48 GiB以下的任何内容实际上会减少可用内存量(!),因为压缩对象指针不再存在.
如果您需要超过32 GB,我建议您考虑使用一些非堆内存.这有效地为您提供了额外的内存空间,不会占用太多堆.
例如,我经常使用200-800 GB但只有1-2 GB的堆.这意味着我拥有最有效的压缩Oops形式和几乎无限的容量.注意:有三种形式的压缩Oops,
使用off heap内存的两种方法是直接内存ByteBuffers和内存映射文件.直接内存可以扩展到主内存大小的3/4左右.内存映射文件可以很好地扩展到硬盘空间的大小(通常更多)
在这里,我已经应用了许多优化,使得最后80%的空间被引用而不是实际数据吃掉.
听起来你没有使用最有效的数据结构.您可以使用不同的数据结构,其中数据更多是使用的空间或至少2/3rds.
您可以通过附加参数使用更大的堆大小:
-XX:ObjectAlignmentInBytes=alignment
该参数是Java对象的固定调整。默认值为8(字节)。指示值必须是 2 的幂,范围从8到256。
以字节为单位的堆大小限制计算如下:
4GB * ObjectAlignmentInBytes
Run Code Online (Sandbox Code Playgroud)
64GB 堆大小可用于压缩指针,如下行:
-XX:ObjectAlignmentInBytes=16
Run Code Online (Sandbox Code Playgroud)
但是,对于更大的堆大小,文档中需要考虑一个注意事项:
注意:随着对齐值的增加,对象之间未使用的空间也会增加。因此,您可能不会意识到使用具有大 Java 堆大小的压缩指针的任何好处。
| 归档时间: |
|
| 查看次数: |
5921 次 |
| 最近记录: |