我需要帮助来了解我从中获取的与 GC 相关的数字如何与jmap
我jstat
传递给 java 的设置相关联。我在具有 16GB 内存的服务器上使用以下设置启动应用程序 (solr):
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Xms12144m -Xmx12144m -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:+UseCompressedOops
的输出jmap
开始:
并发 Mark-Sweep GC 堆配置: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 12733906944 (12144.0MB) 新大小 = 2686976 (2.5625MB) MaxNewSize = 130809856 (124.75MB) OldSize = 5439488 (5.1875MB) 新比率 = 4 幸存者比率 = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 176160768 (168.0MB)
为什么NewSize
, MaxNewSize
, OldSize
, 和PermSize
都那么小,而MaxHeapSize
是大的?不应该NewSize + OldSize = heap size
吗?总堆大小不应该接近MaxHeapSize
吗?为什么设置为 4时NewSize
正好是一半?OldSize
NewRatio
其余的jmap
输出如下。它与上述内容相匹配,并且包含一个concurrent mark-sweep generation
我也不知道如何解释的部分。
此外,GC 日志表明“所需的幸存者大小”为 6.2MB,这也很奇怪,因为我知道-XX:SurvivorRatio=8
应该使幸存者空间为NewSize
.
最后,我只在我的 GC 日志中看到ParNew
消息,我知道这是 Eden 的 GC。
堆使用: 新一代(伊甸园 + 1 个幸存者空间): 容量 = 117768192 (112.3125MB) 使用 = 20402232 (19.45708465576172MB) 免费 = 97365960 (92.85541534423828MB) 17.324059793666528% 已使用 伊甸空间: 容量 = 104726528 (99.875MB) 使用 = 16408336 (15.648208618164062MB) 免费 = 88318192 (84.22679138183594MB) 15.667793359863893% 已使用 从太空: 容量 = 13041664 (12.4375MB) 使用 = 3993896 (3.8088760375976562MB) 免费 = 9047768 (8.628623962402344MB) 30.624128945508794% 已使用 到太空: 容量 = 13041664 (12.4375MB) 使用 = 0 (0.0MB) 免费 = 13041664 (12.4375MB) 0.0% 已使用 并发标记扫描生成: 容量 = 12603097088 (12019.25MB) 使用 = 7903352408 (7537.22420501709MB) 免费 = 4699744680 (4482.02579498291MB) 62.70960505037411% 已使用 烫发一代: 容量 = 45903872 (43.77734375MB) 使用 = 27759192 (26.473228454589844MB) 免费 = 18144680 (17.304115295410156MB) 60.472441191889% 已使用