为什么JVM在老一代只有半满的情况下继续做全gc?

时间:2012-11-26 09:03:45

标签: java garbage-collection jvm-hotspot concurrent-mark-sweep

我在CentOS 64位linux机器上使用jdk 1.7.0_09。

与gc相关的vm args是

  

-Xmx4g -Xmn2g -XX:SurvivorRatio = 4 -XX:PermSize = 128m -XX:MaxPermSize = 128m -XX:InitialTenuringThreshold = 15 -XX:CMSWaitDuration = 50 -XX:MaxTenuringThreshold = 15 -XX:+ UseConcMarkSweepGC -XX :+ UseParNewGC -XX:CMSInitiatingOccupancyFraction = 80 -XX:+ CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize = 128m

但它一直在做完整的gc

jstat -gcutil pid 1000    
    S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
    0.00   0.00  15.62  57.52  19.90     11    2.081 11109 7454.686 7456.767   
    0.00   0.00  15.81  57.52  19.90     11    2.081 11109 7454.686 7456.767   
    0.00   0.00  15.81  57.51  19.90     11    2.081 11111 7454.892 7456.973   
    0.00   0.00  16.06  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.06  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.27  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.27  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.51  19.90     11    2.081 11111 7455.115 7457.196
    0.00   0.00  16.29  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.29  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.34  57.47  19.90     11    2.081 11113 7455.549 7457.629
    0.00   0.00  16.42  57.47  19.90     11    2.081 11114 7455.549 7457.629
    0.00   0.00  16.42  57.44  19.90     11    2.081 11115 7455.986 7458.067

2 个答案:

答案 0 :(得分:2)

尽管列有“FGC”,但它并不是一个完整的GC。 CMS正在做的是并发集合,以查看是否可以从旧集合中清除任何内容(您可以看到它正在进行中)。可以告诉它不是一个完整的GC的方法是,一个完整的GC清除伊甸园空间并从一个幸存者空间复制到另一个幸存者空间。

恕我直言您使用的选项越多,您就越有可能遇到令人惊讶的结果。我会坚持最少的选项,看看它是如何表现的。只有在您知道他们将始终提供帮助时才添加选项。

尝试开始,

-mx4g -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC

答案 1 :(得分:0)

这很正常。它你会做“-verbose:gc”你可以看到“Full”Collection实际上是一个并发的(你指定“-XX:+ UseConcMarkSweepGC”)你也可以看到时间没有增加太多。那个时间是并发的,而不是停止世界。