2017-10-10 81 views
1

我有一个使用Tomcat Webserver构建的Java应用程序。 使用Java任务控制我知道在压力下,GC非常占优势。每个GC周期中,CPU都非常高。 我想知道的是,每个GC循环都在做什么,特别是我想知道它正在推广哪个对象,以及哪个对象正在释放。对于被释放的对象,我想知道,不仅是它们是什么类型,而且它们是在哪里创建的。只知道我有很多字节[]或字符串,显然没有帮助,因为有很多地方可以创建这些地方,但只有少数地方在我的控制之下并占主导地位。Java GC很高,如何找出哪些对象是GCed

有没有人知道这样做的工具或方法。

在此先感谢。

+0

您是否使用了[Flight recording](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr005.html)? – nullpointer

+0

是的,飞行记录仪是我发现GC导致CPU峰值的原因。但是,JFR不会提供我需要/描述的信息。或者至少我不知道如何获取该信息 –

+0

GC日志以及您的JFR配置文件可以很好地了解原因。 – nullpointer

回答

1

您需要记录对象分配,而不是收集的内容。渐近式收集和分配是相同的,但后者可以提供更多的信息。

各种java概要分析解决方案提供此类功能。

2

选项1 - 使用Java Flight Recorder allocation profiling option。我明白你对死对象感兴趣,但诀窍是大多数新对象很快就会死掉。

选项2 - SJK死对象直方图。 SJK只需要很少的堆直方图(与jmap -histo相同)并报告差异。它有选择计算死亡和年轻的死亡人口。