2011-05-27 33 views
0

我有一个独立独行的Java应用程序,其中JVM PARAMS是:JVM堆调整时-Xmx和-Xms是相同的,虽然

-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都2克,但我发现堆的大小总是调整了一下: the red line represents the total heap size, the blue one represents used

红线表示总堆大小,蓝色代表一个使用 我觉得红线应该是直的,但事实并非如此。 但在另一种网络应用程序,该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 

其视觉堆的使用情况图表是:

heap not resize when cms gc

总堆大小正好尽可能2g和红线是横向稳定,这是我认为应该的。

的两个应用程序的主要区别是所用的GC策略,一个是平行GC,另一个是CMS。 的GC策略是否对堆空间的大小调整有什么影响?或-Xmn PARAM对堆大小调整,我不知道有一定的影响?

回答

0

并行GC通过一些被称为GC的人体工程学设计,其试图在运行时调整内部堆大小(旧的,新,烫发等),以帮助肉类吞吐量或延迟目标做一些技巧。

它可能是监视工具不希望看到堆大小调整的部分,并且报告这些调整大小,而不是直接平滑出来。