Java 澄清新JVM内存参数InitialRAMPercentage和MinRAMPercentage的含义

Java 澄清新JVM内存参数InitialRAMPercentage和MinRAMPercentage的含义,java,docker,jvm,Java,Docker,Jvm,参考: 我真的很难弄清楚MinRAMPercentage做了什么,尤其是与InitialRAMPercentage相比 我假设InitialRAMPercentage在启动时设置堆的数量,MinRAMPercentage和MaxRAMPercentage设置允许JVM收缩/增长到的堆的底部和顶部限制 显然情况并非如此。当我启动JVM时(使用UseContainerSupport,具有这些新的内存设置参数),如下所示: 设置InitialHeap和MaxHeap时,我找不到“最小堆大小”值;因此,

参考:

我真的很难弄清楚MinRAMPercentage做了什么,尤其是与InitialRAMPercentage相比

我假设InitialRAMPercentage在启动时设置堆的数量,MinRAMPercentage和MaxRAMPercentage设置允许JVM收缩/增长到的堆的底部和顶部限制

显然情况并非如此。当我启动JVM时(使用UseContainerSupport,具有这些新的内存设置参数),如下所示:

设置InitialHeap和MaxHeap时,我找不到“最小堆大小”值;因此,MinRampentage似乎从未被使用过

非常困惑,显然,我不是唯一一个;正如我收集和分析的那样,OpenJ9似乎也没有完全解析这些选项的意图。他们似乎选择了不实施MinRAMPercentage AFAIC


那么:设置MinRAMPercentage的实际预期用途和效果是什么?

-XX:InitialRAMPercentage
用于在未设置
InitialHeapSize
/
-Xms
时使用

这听起来有悖常理,但当未设置
MaxHeapSize
/
-Xmx
时,使用
-XX:MaxRAMPercentage
-XX:MinRAMPercentage
计算最大堆大小:

  • 对于物理内存较小的系统,估计MaxHeapSize为

    phys_mem * MinRAMPercentage / 100  (if this value is less than 96M)
    
    MAX(phys_mem * MaxRAMPercentage / 100, 96M)
    
  • 否则(非小物理内存)
    MaxHeapSize
    估计为

    phys_mem * MinRAMPercentage / 100  (if this value is less than 96M)
    
    MAX(phys_mem * MaxRAMPercentage / 100, 96M)
    
因为它还考虑了其他因素,所以有点复杂

注意:计算初始和最大堆大小的算法取决于特定的JVM版本。控制堆大小的首选方法是显式设置
Xmx
Xms


另请参见。

您如何解释这一点?命令:
sudo docker run--memory='10m'采用openjdk/openjdk11 java-XX:+PrintFlagsFinal-version | grep MaxHeapSize
Result:
拾取java_工具选项:-XX:+UseContainerSupport size_t MaxHeapSize=8388608{product}{人体工程学}openjdk version“11”2018-09-25 openjdk运行时环境采用openjdk(构建11+28)OpenJDK 64位服务器VM采用OpenJDK(构建11+28,混合模式)
根据您的解释,MaxHeapSize不应为5M8M@MichałMielec正如我所说,还有其他因素,如和。它们是在内存限制很小的时候出现的。如果它们没有明确提供,InitialHeapSize/MaxHeapSize不是总是设置并用作Xms/Xms吗?@freakman不确定我是否理解你的意思。请提出一个单独的问题,描述你的问题并提供一个例子。