我可以使用比32 GB更多的堆与压缩的oops

2022-09-03 16:52:17

我可以理解,使用 压缩的oops ,我们只能使用32 GB的RAM。有没有某种方式,我可以使用更多,比如通过分配2堆或其他东西?

感谢维尼斯


答案 1

您不能有多个堆(但是您可以拥有多个JVM,这称为向外扩展而不是向上扩展)。

JVM 使用低于 32 GiB 内存的压缩对象指针。如果您了解它的工作原理(从每个地址中删除最年轻的三位,因为它们由于内存对齐而始终为0),您将了解您无法进一步。

有一个有趣的事实:一旦超过这个32 GiB边界,JVM将停止使用压缩对象指针,从而有效地减少可用内存。这意味着将 JVM 堆增加到 32 GiB 以上,您必须远远超出 32 GiB。根据伟大的“我曾经学到的关于JVM性能调优@twitter(大约13:00)演示,将堆从32 GiB增加到48 GiB以下的任何内容实际上会减少可用内存量(!),因为压缩对象指针不再存在。


答案 2

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

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

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

使用堆外内存的两种方法是直接内存字节缓冲器和内存映射文件。直接内存可以很好地扩展到主内存大小的3/4左右。内存映射文件可以很好地扩展到硬盘驱动器空间的大小(通常要大得多)

在这里,我应用了许多优化,使得在最后80%的空间被引用而不是实际数据所吞噬。

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


推荐