当-Xmx和-Xms相同时,jvm堆会调整大小

kninwzqo  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(154)

我有一个独立的java应用程序,其中jvm参数是:

-Xmx2g -Xms2g -Xmn1g -XX:PermSize=96m -XX:+DisableExplicitGC 
-XX:+UseFastAccessorMethods  -XX:+UseParallelGC -XX:+UseParallelOldGC 
-XX:MaxTenuringThreshold=63 -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true

正如我们所看到的,-Xmx和-Xms都是2g,但我发现堆大小总是会稍微调整:

红线代表总的堆大小,蓝线代表已使用的我认为红线应该是直的,但它不是。但在另一个web应用程序中,jvm参数是:

-Xmx2g -Xms2g -Xmn512m -XX:PermSize=196m -Xss256k -XX:+DisableExplicitGC 
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled 
-XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m 
-XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly 
-XX:CMSInitiatingOccupancyFraction=70 -XX:-ReduceInitialCardMarks 
-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true

其可视化堆使用情况图表为:

总的堆大小正好是2g,红线是水平稳定的,这就是我认为它应该是的。
这两个应用程序的主要区别是使用的GC策略,一个是并行GC,另一个是CMS。GC策略对堆空间的大小调整有影响吗?或者-Xmn参数对堆大小调整有一些我不知道的影响?

zmeyuzjn

zmeyuzjn1#

并行GC通过所谓的GC人体工程学来实现一些技巧,这些技巧试图在运行时调整内部堆大小(旧的、新的、永久的等),以帮助实现吞吐量或延迟目标。
监视工具可能不希望看到堆的某些部分调整大小,而是直接报告这些调整大小,而不是将其平滑化。

相关问题