为什么在jstat -gcutil的结果中没有显示99%到14%的FullGC而是旧的gen?

时间:2015-01-13 09:00:05

标签: java garbage-collection jvm

jstat -gcutil如下所示:

enter image description here

老一代从13.78到99.98,然后到14.81,但FGCT总是1, 为什么?

除FullGC外,还有其他原因造成这种情况吗?

GC是CMS和JVM参数:

  

-Xms4096m -Xmx4096m -Xss256k -XX:PermSize = 256m -XX:MaxPermSize = 256m -XX:NewSize = 512m -XX:MaxNewSize = 512m -XX:SurvivorRatio = 16 -XX:+ UseParNewGC -XX:ParallelGCThreads = 16 -XX:MaxTenuringThreshold = 32 -XX:+ UseConcMarkSweepGC -XX:ParallelCMSThreads = 8 -XX:+ CMSParallelRemarkEnabled -XX:+ CMSPermGenPrecleaningEnabled -XX:CMSInitiatingOccupancyFraction = 70 -XX:+ UseCMSCompactAtFullCollection

2 个答案:

答案 0 :(得分:1)

我自己做了一些测试,我的结论是,当你使用JVM参数运行时,它似乎是jstat中的一个错误。我在一个简单的测试应用程序上同时运行了jstat -gc和jstat -gcutil,并得到了以下输出:

jstat -gc:

S0C    S1C    S0U    S1U      EC       EU        OC         OU
29120,0 29120,0  0,0    0,0   466048,0 18642,2  3670016,0     0,0
29120,0 29120,0  0,0    0,0   466048,0 18642,2  3670016,0     0,0
29120,0 29120,0  0,0    0,0   466048,0 18642,2  3670016,0     0,0
29120,0 29120,0  0,0    0,0   466048,0 18642,2  3670016,0     0,0
29120,0 29120,0  0,0    0,0   466048,0 18642,2  3670016,0     0,0
29120,0 29120,0  0,0    0,0   466048,0 55926,2  3670016,0     0,0
29120,0 29120,0  0,0    0,0   466048,0 369663,6 3670016,0     0,0
29120,0 29120,0  0,0   29120,0 466048,0 466048,0 3670016,0   94773,6
29120,0 29120,0  0,0   29120,0 466048,0 299100,8 3670016,0   118478,6
29120,0 29120,0 29120,0  0,0   466048,0  9163,2  3670016,0   254498,6

jstat -gcutil

 S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
  0,00   0,00   4,00   0,00   0,93      0    0,000     0    0,000    0,000
  0,00   0,00   4,00   0,00   0,93      0    0,000     0    0,000    0,000
  0,00   0,00   4,00   0,00   0,93      0    0,000     0    0,000    0,000
  0,00   0,00   4,00   0,00   0,93      0    0,000     0    0,000    0,000
  0,00   0,00   4,00   0,00   0,93      0    0,000     0    0,000    0,000
  0,00   0,00  26,00   0,00   0,97      0    0,000     0    0,000    0,000
  0,00   0,00  89,32   0,00   0,97      0    0,000     0    0,000    0,000
  0,00 100,00 100,00 100,00   0,97      1    0,000     0    0,000    0,000
  0,00 100,00  80,02   3,23   0,97      1    0,905     0    0,000    0,905
100,00   0,00  13,76   6,93   0,97      2    1,441     0    0,000    1,441

正如你所看到的,我的Old在运行时使用-gcutil跳转到100,即使应用程序刚刚开始填充旧的gen。 jstat -gc显示老一代几乎完全是空的。该应用程序非常简单,只需填写一个HashMap,为什么当jstat -gcutil这样说时,旧的gen将无法100%填满。

答案 1 :(得分:0)

  1. 当收集年轻一代和永久代时,会计算HotSpot JVM完整GC ...(来源:Analyzing the Performance Impact of Memory Utilization and Garbage Collection,转到主要与次要垃圾收集部分)

  2. 在不同工具中使用“完全垃圾收集”这个术语,有些显示没有GC事件,其他人报告gc事件,如果同时运行和相同的JVM。 如果您必须比较输出/报告,请记住这一点。

  3. 回到你的问题:

    当我查看您的输出时,我可以看到永久空间利用率正在增加。它从19.59开始,在输出的最后一行是19.70。 直到那一刻才发生永久性生成GC 。这就是FGC仍然是1的原因。

    关于jstats -gcutil输出的其他一些注释。

    • O:旧的空间利用率,或者你称之为旧的。
    • P:永久空间利用
    • YGC:年轻一代垃圾收集计数
    • FGC:完全垃圾收集计数
    • GCT:垃圾收集总时间。

    . S0 S1 E O P YGC YGCT FGC FGCT GCT 12.44 0.00 27.20 9.49 96.70 78 0.176 5 0.495 0.672 12.44 0.00 62.16 9.49 96.70 78 0.176 5 0.495 0.672 12.44 0.00 83.97 9.49 96.70 78 0.176 5 0.495 0.672 0.00 7.74 0.00 9.51 96.70 79 0.177 5 0.495 0.673

    YGC,YGCT,FGC和FGCT 的显示值是指Hotspot JVM启动的时刻,而不是指启动jstat -gcutil的时刻。只是你想知道输出可能从例如12 FGC在第一行。

    以下是jstat doc:Java 6 jstat doc