我可以使用压缩oops多于32 GB的堆

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以下的任何内容实际上会减少可用内存量(!),因为压缩对象指针不再存在.

  • 嗯,盈亏平衡点是 48GiB 是不正确的。确切的数量取决于内存中保存的指针数量。每个应用程序的情况都不同。 (2认同)

Pet*_*rey 8

如果您需要超过32 GB,我建议您考虑使用一些非堆内存.这有效地为您提供了额外的内存空间,不会占用太多堆.

例如,我经常使用200-800 GB但只有1-2 GB的堆.这意味着我拥有最有效的压缩Oops形式和几乎无限的容量.注意:有三种形式的压缩Oops,

  • 普通32位未移位(最高约2 GB)
  • 32位移位(最高约26 GB)
  • 32位移位和偏移(最大~32 GB)

使用off heap内存的两种方法是直接内存ByteBuffers和内存映射文件.直接内存可以扩展到主内存大小的3/4左右.内存映射文件可以很好地扩展到硬盘空间的大小(通常更多)

在这里,我已经应用了许多优化,使得最后80%的空间被引用而不是实际数据吃掉.

听起来你没有使用最有效的数据结构.您可以使用不同的数据结构,其中数据更多是使用的空间或至少2/3rds.

  • “我通常使用 200-800 GB”。我羡慕你...那是虚拟内存还是由实际 RAM 支持? (2认同)
  • @Thilo 我使用虚拟内存,因为我只有 128 GB 的主内存,但我的一些客户端的主内存在 512 GB 到 3 TB 之间。 (2认同)

Umu*_*zun 6

您可以通过附加参数使用更大的堆大小: -XX:ObjectAlignmentInBytes=alignment

该参数是Java对象的固定调整。默认值为8(字节)。指示值必须是 2 的幂,范围从8256

以字节为单位的堆大小限制计算如下:

4GB * ObjectAlignmentInBytes
Run Code Online (Sandbox Code Playgroud)

64GB 堆大小可用于压缩指针,如下行:

-XX:ObjectAlignmentInBytes=16
Run Code Online (Sandbox Code Playgroud)

但是,对于更大的堆大小,文档中需要考虑一个注意事项:

注意:随着对齐值的增加,对象之间未使用的空间也会增加。因此,您可能不会意识到使用具有大 Java 堆大小的压缩指针的任何好处。