编辑1:

编辑1:

我正在运行Solr云在 k8s 上使用以下设置:

堆参数:

-server -Xms280m -Xmx312m

其他参数:

-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -XX:ParallelGCThreads=4 -XX:AdaptiveSizePolicyOutputInterval=1 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:MaxGCPauseMillis=300 -XX:GCTimeRatio=19 -XX:AdaptiveSizePolicyWeight=90 -XX:MaxMetaspaceSize=128m -XX:MaxMetaspaceFreeRatio=90 -XX:MetaspaceSize=96m -XX:+ParallelRefProcEnabled

管理页面上显示的最大堆只有277.5米,即34.5米小于Xmx

在此处输入图片描述

如果我将堆参数更改为

-server -Xms312m -Xmx312m

那么最大堆大约为 300m,这更接近 Xmx

我的问题是:

  • 为什么第一个设定会有这么大的差别?
  • 为什么当我设置 Xms = Xmx 时差异会变小
  • JVM 还会遵守我的 Xmx 设置吗?(我的应用程序还能增长到 312m 吗?)

更多观察...

我已尝试使用另一种内存设置:

-server -Xms296m -Xmx360m

Solr 管理界面上显示的最大堆大小为320 米

经过一些计算,似乎最大堆总是在我设置的 Xmx 的 90% 左右。

  312 * 0.9 = 280.8 (just 3.3m more than 277.5m)
  360 * 0.9 = 324  (just 4m more than 320m)

为什么会发生这种情况?

答案1

以下是一些细节。

-Xmx= 最大 Java 堆

-Xms= 初始和最小 Java 堆

选项-Xmx-Xms选项组合用于限制 Java 堆大小。Java 堆永远不会大于-Xmx。此外,该-Xms值可用作“最小堆大小”,通过设置-Xms=来设置固定堆大小-Xmx

但是-Xmx并不限制 JVM 可以使用的内存总量。

以下是我的在线回答

为什么第一个设定会有这么大的差别?

这是因为初始内存和最大内存堆之间的差异。

为什么当我设置 Xms = Xmx 时差异会变小

对于生产系统,我建议使用相同的系统,原因是您将在大多数情况下获得启动和更少的 gc,同样,这取决于工作负载和系统分析以及应用程序的性质。

JVM 还会遵守我的 Xmx 设置吗?(我的应用程序还能增长到 312m 吗?)

答案是肯定的,但不要与 Xmx 和 JVM 混淆。当应用程序需要更多资源时,堆将增长。

编辑1:

堆有以下三个部分:

  1. 伊甸园
  2. 幸存者
  3. 终身教授
  4. 预订的

根据您的快照,它显示 3 个部分,直到 195.13MB 到 209.50MB 到 277.50MB 以及其余部分(如果保留)。

希望这会有所帮助。

相关内容