我有一个独立的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参数对堆大小调整有一些我不知道的影响?
1条答案
按热度按时间zmeyuzjn1#
并行GC通过所谓的GC人体工程学来实现一些技巧,这些技巧试图在运行时调整内部堆大小(旧的、新的、永久的等),以帮助实现吞吐量或延迟目标。
监视工具可能不希望看到堆的某些部分调整大小,而是直接报告这些调整大小,而不是将其平滑化。