我正在运行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:
堆有以下三个部分:
- 伊甸园
- 幸存者
- 终身教授
- 预订的
根据您的快照,它显示 3 个部分,直到 195.13MB 到 209.50MB 到 277.50MB 以及其余部分(如果保留)。
希望这会有所帮助。