垃圾收集:如何计算伊甸园空间(和其他世代规模)?

时间:2012-08-06 14:31:32

标签: java solr garbage-collection

我需要帮助了解我从jmapjstat得到的GC相关数字与我传递给java的设置的关系。我在具有16GB内存的服务器上使用以下设置启动应用程序(solr):

-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled 
-Xms12144m -Xmx12144m 
-XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseCompressedOops

jmap的输出开始:

Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 12733906944 (12144.0MB)
   NewSize          = 2686976 (2.5625MB)
   MaxNewSize       = 130809856 (124.75MB)
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 4
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 176160768 (168.0MB)

NewSize很大时,为什么MaxNewSizeOldSizePermSizeMaxHeapSize都这么小?不应该NewSize + OldSize = heap size?整体堆大小是否应该接近MaxHeapSize?当NewSize设置为4时,为什么OldSize恰好是NewRatio的一半?

jmap输出的其余部分如下。它与上面的内容相匹配,并包含一个我不知道如何解释的concurrent mark-sweep generation部分。

此外,GC日志表明“期望的幸存者大小”是6.2MB,这也很奇怪,因为我知道-XX:SurvivorRatio=8应该使幸存者空间为NewSize的1/8。

最后,我只在GC日志中看到ParNew条消息,据我所知,它是Eden的GC。


Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 117768192 (112.3125MB)
   used     = 20402232 (19.45708465576172MB)
   free     = 97365960 (92.85541534423828MB)
   17.324059793666528% used
Eden Space:
   capacity = 104726528 (99.875MB)
   used     = 16408336 (15.648208618164062MB)
   free     = 88318192 (84.22679138183594MB)
   15.667793359863893% used
From Space:
   capacity = 13041664 (12.4375MB)
   used     = 3993896 (3.8088760375976562MB)
   free     = 9047768 (8.628623962402344MB)
   30.624128945508794% used
To Space:
   capacity = 13041664 (12.4375MB)
   used     = 0 (0.0MB)
   free     = 13041664 (12.4375MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 12603097088 (12019.25MB)
   used     = 7903352408 (7537.22420501709MB)
   free     = 4699744680 (4482.02579498291MB)
   62.70960505037411% used
Perm Generation:
   capacity = 45903872 (43.77734375MB)
   used     = 27759192 (26.473228454589844MB)
   free     = 18144680 (17.304115295410156MB)
   60.472441191889% used

1 个答案:

答案 0 :(得分:3)

  

当MaxHeapSize很大时,为什么NewSize,MaxNewSize,OldSize和PermSize都这么小?

尺寸只有它们需要的尺寸。如果你生成更多短暂的垃圾,NewSize会更大(我不知道MaxNewSize是如何设置的,但它通常比我设置的要小)

  

并发标记扫描生成

这是capacity =最大尺寸,used =已使用,free =容量 - 已使用。

  

我的GC日志中的ParNew消息,我理解的是Eden的GC。

正如你所指出的那样,新的空间很小,所以它经常清理,而旧的空间很大,所以如果有的话很少清理。