Java垃圾回收频率高,如何找出被回收的对象?

3
我有一个使用Tomcat Web服务器构建的Java应用程序。 使用Java任务控制,我知道在压力下,GC非常显著。每个GC循环,CPU都会非常高。 我想弄清楚的是每个GC循环到底在做什么,特别是我想知道它正在提升哪个对象以及释放哪些对象。对于被释放的对象,我不仅想知道它们的类型,还想知道它们在哪里创建。只知道我有很多byte[]或字符串显然没有帮助,因为这些可以在许多地方创建,但只有少数在我的控制之下,并且占主导地位。
请问是否有工具或方法可以做到这一点?
提前致谢。

你使用过飞行记录吗? - Naman
是的,飞行记录器是我发现GC引起CPU峰值的方式。然而,JFR并没有提供我需要/描述的信息。或者至少我不知道如何获得那些信息。 - Michael P
1
GC日志和JFR配置文件一起使用可以足够了解问题的原因。 - Naman
1
请确保启用JFR事件类型“在新TLAB中分配”和“在TLAB之外分配”。在JMC 6(随JDK 9一起提供,但也可以查看JDK 7/8记录)中,您可以查看内存页面,并在Stacktrace视图中查看分配站点。 - Klara
2个回答

2

你需要记录对象分配,而不是被收集的内容。从渐近意义上讲,收集和分配是相同的,但当它发生时,后者可以提供更多信息。

各种Java分析解决方案都提供了这样的功能。


2
选项1 - 使用Java Flight Recorder 分配分析选项。我知道您对死对象感兴趣,但诀窍在于大多数新对象很快就会变成死对象。
选项2 - SJK死对象直方图。SJK获取堆的几个类直方图(与jmap -histo相同),并报告差异。它有计算死亡和年轻死亡人口的选项。

“分配配置文件选项”链接已经失效。您能否更新它并引用相关内容? - Suma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接