InitialRAMPercentage,MinRAMPercentage,MaxRAMPercen


本文尝试阐明InitialRAMPercentage,MinRAMPercentage,MaxRAMPercentage JVM参数之间的区别。自Java 8更新191起引入了这些参数。当在物理服务器或容器中运行Java应用程序时,它们用于配置Java应用程序的堆大小。在本文中,让我们回顾它们之间的差异。

InitialRAM百分比 “ -XX:InitialRAMPercentage”用于计算Java应用程序的初始堆大小。假设您正在配置-XX:InitialRAMPercentage = 25并且总物理内存(或容器内存)为1GB,那么您的Java应用程序的堆大小将为〜250MB(即1GB的25%)。

仅当未传递'-Xms'JVM参数时,才会使用'-XX:InitialRAMPercentage'来得出初始堆大小。如果传递了'-Xms'JVM参数,则JVM将忽略'-XX:InitialRAMPercentage'。

MaxRAMPercentage,MinRAMPercentage “ -XX:MaxRAMPercentage”和“ -XX:MinRAMPercentage”都用于确定最大Java堆大小。JDK开发团队可以使用比“ -XX:MinRAMPercentage”更好的名称。此名称使我们认为,“-XX:MinRAMPercentage”参数用于配置最小堆大小。但这不是真的。

仅当物理服务器(或容器)中的总可用内存大小小于250MB(大约)时,“-XX:MinRAMPercentage” JVM参数才会用于计算Java堆大小。假设您正在配置-XX:MinRAMPercentage = 50且整体物理内存(或容器)内存为100MB,那么Java应用程序的最大堆大小将设置为50MB(即100MB的50%)。

仅当物理服务器(或容器)中的总可用内存大小大于250MB(大约)时,“-XX:MaxRAMPercentage” JVM参数才会用于计算Java堆大小。假设您正在配置-XX:MaxRAMPercentage = 75并且物理服务器(或容器)的整体内存为1GB,那么您的Java应用程序的最大堆大小将设置为750MB(即1GB的75%)。

为了证明这一理论,请考虑以下两个示例。

示例1:较小的内存 让我们将容器的内存大小配置为100MB,将MaxRAMPercentage设置为25,将MinRAMPercentage设置为50。由于容器的内存大小为100MB(小于250MB限制),因此JVM使用“ MinRAMPercentage”来得出堆的大小。您会注意到,JVM报告此配置的最大堆大小为48.38M(即100MB的50%)。您可以看到“ MaxRAMPercentage” JVM参数被忽略。

# docker run -m 100MB openjdk:10 java -XX:MaxRAMPercentage=25

-XX:MinRAMPercentage=50 -XshowSettings:vm -version VM settings:

Max. Heap Size (Estimated): 48.38M Using VM: OpenJDK 64-Bit Server VM

示例2:大内存大小

让我们将容器的内存大小配置为1GB,将MaxRAMPercentage设置为25,将MinRAMPercentage设置为50。由于容器的内存大小为1GB(大于250MB的限制),因此JVM使用“ MaxRAMPercentage”来得出堆的大小。您会注意到,JVM报告此配置的最大堆大小为247.50M(即1GB的25%)。您可以看到'MinRAMPercentage'JVM参数被忽略。

# docker run -m 1GB openjdk:10 java -XX:MaxRAMPercentage=25

-XX:MinRAMPercentage=50 -XshowSettings:vm -version VM settings:

Max. Heap Size (Estimated): 247.50M Using VM: OpenJDK 64-Bit Server VM

仅当未传递'-Xmx'JVM参数时,才使用'-XX:MaxRAMPercentage''-XX:MinRAMPercentage'来得出最大堆大小。如果传递了-Xmx JVM参数,则JVM将忽略这两个参数。

在以下示例中,您可以看到已配置“ -XX:MaxRAMPercentage = 25”,“-XX:MinRAMPercentage = 25”和“ -Xmx512m”。您可以看到最大堆大小设置为512M,这表明“ -Xmx”中指定的值正在生效。

# docker run -m 1GB openjdk:10 java -XX:MaxRAMPercentage=25

-XX:MinRAMPercentage=25 -Xmx512m -XshowSettings:vm -version VM settings:

Max. Heap Size: 512.00M Using VM: OpenJDK 64-Bit Server VM

最佳实践:当您开始使用'','',''JVM参数时,它有可能影响您的垃圾回收,应用程序的性能特征。您可以使用免费的工具,例如GCeasyIBM GCMemory VisualizerHP jmeter来研究此行为。

结论 因此,简而言之:

  1. 要为您的应用程序设置初始堆大小,请使用'-XX:InitialRAMPercentage'
  2. 如果配置了“ -Xms”,则“ -XX:InitialRAMPercentage”将无法确定初始堆大小。
  3. “ -XX:MinRAMPercentage”和“ -XX:MaxRAMPercentage”均用于设置应用程序的最大堆大小。
  4. 如果配置了“ -Xmx”,则“ -XX:MinRAMPercentage”和“ -XX:MaxRAMPercentage”将不会决定最大堆大小。
  5. 如果整个物理服务器(或容器)的内存大小超过250MB,则不必配置“ -XX:MinRAMPercentage”,仅配置“ -XX:MaxRAMPercentage”就足够了。大多数企业级Java应用程序将以超过250MB的速度运行(除非您正在用Java构建IoT或网络设备应用程序)。


原文链接:http://codingdict.com