“PS Old Gen”的高峰用量100%是过度垃圾收集的症状吗?

时间:2015-10-13 03:41:15

标签: java garbage-collection

我正在研究在Java 8(1.8.0_45)和Tomcat 8(8.0.26)上运行的Web应用程序中吞吐量问题的丢失。

我有关于PS Old Gen内存使用的可用信息:

"PS Old Gen" (Heap memory)
--------------------------
Current usage 535451120/716177408 (74.77%, 180726288 free)
  Max possible 716177408   
Peak usage 716170120/716177408 (100.00%, 7288 free)
  Max possible 716177408   
Usage after last GC 351438392/716177408 (49.07%, 364739016 free)
  Max possible 716177408

我们正在使用这些设置(以及我认为无关紧要的其他设置):

-XX:+HeapDumpOnOutOfMemoryError
-XX:-UseGCOverheadLimit
-XX:MaxMetaspaceSize=256m

PS Old Gen完全填满是否正常?这个空间的集合是仅在它变满时触发的,还是通常会更快地发生?

我不相信存在长时间运行的内存泄漏,因为在上一次GC之后使用仅显示49%的使用率。该应用程序通常也具有良好的正常运行时间,而不会显示整体堆使用量的增加(通过JMX监控)。

2 个答案:

答案 0 :(得分:2)

它恢复51%的事实很有希望,但真正的问题是Full GC的运行频率。您可以启用GC日志记录,以了解有关GC运行的频率,阻塞时间以及正在运行的GC类型的更多信息。这是通过-Xloggc:路径打开的,还可以打开其他详细信息,例如-XX:PrintGCDetails和-XX:PrintGCTimeStamps

答案 1 :(得分:1)

您可以像@Michael建议的那样启用GC记录到文件。是的,因为就应用程序线程而言,完整的GC是“停止世界”行动,其频率将成为真正引起关注的原因。可视化和GC摘要的一个非常有用的工具是GCViewer,它可以帮助您在GC统计信息收集的时间段内可视化JVM中发生的事情。我建议您在相当长的时间内收集应用服务器的GC信息,在此期间您认为吞吐量正在受到影响,然后使用GCViewer。它帮助我们进行了这样的分析。