我有一个独立的java应用程序,jvm params是:
-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,但我发现堆大小总是调整一下:
红线表示总堆大小,蓝色表示已使用 我认为红线应该是直的,但事实并非如此。 但在另一个网络应用程序中,jvm params是:
-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 param对我不知道的堆调整大小有什么影响?
答案 0 :(得分:0)
并行GC通过称为GC人体工程学的方法做了一些技巧,它试图在运行时调整内部堆大小(OLD,new,perm等)以帮助实现肉类吞吐量或延迟目标。
监视工具可能不希望看到堆的某些部分调整大小并直接报告这些调整大小而不是平滑它。