具有大量内存的机器上的 OpenJDK MaxRAMPercentage

OpenJDK MaxRAMPercentage on a machine with very large amount of memory

当 运行 OpenJDK 11 在具有 60GB 内存(或更多)内存的机器上时, MaxRAMPercentage 最多只能分配 30GB 左右。

这可以正常工作:

>~# java   -XX:MaxRAMPercentage=10 -XshowSettings:vm -version
VM settings:
    Max. Heap Size (Estimated): 5.90G
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Debian-1bpo91)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Debian-1bpo91, mixed mode, sharing)

但是当百分比应该产生 30G 以上的堆大小时,我得到:

>~# java   -XX:MaxRAMPercentage=75 -XshowSettings:vm -version
VM settings:
    Max. Heap Size (Estimated): 29.97G
    Using VM: OpenJDK 64-Bit Server VM

openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment (build 11.0.4+11-post-Debian-1bpo91)
OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Debian-1bpo91, mixed mode, sharing)

使用旧的 -Xmx 作品(例如 -Xmx50G)。

我错过了什么? MaxRAMPercentage 应该是有界的吗?

问题是 bug/feature 与 CompressedOops 相关(CompressedOops 将堆大小限制为 32GB,而 -Xmx 禁用 CompressedOops,而 MaxRAMPercentage 则不)。

要解决/解决方法,您可以:

  • 添加 -XX:-UseCompressedOops 以禁用 CompressedOops
  • 使用OpenJDK13,bug已修复

错误报告是 here。 HT @Arnaud 带我去那里。