Java - 哪些对象正在被垃圾回收?

4

我的应用程序有很多垃圾回收,我想分析一下。

我想要看到的是哪些对象被垃圾回收了。我认为这会让我知道在哪里寻找优化(添加缓存或其他操作)。

是否有选项可以打印详细的GC信息,包括每个类中垃圾回收了多少个对象?

我正在使用G1GC,如果这很重要的话。

谢谢!

5个回答

3

Oracle的JFR(Java Flight Recorder或Java Mission Control)是一种非常好的工具,可以帮助进行此任务 - 它显示每个对象的GC负载 - 这意味着每个类别生成了多少个对象(这与被收集的对象相对应)。强烈推荐使用。


0

我在日志中不分类名称。我可以看到有关收集的总对象数量的详细信息,但我没有找到与类相关的断点。 - duduamar

0

我不确定G1GC,但通常我发现VisualVM工具包非常有帮助。它是一个良好特性、足够深入的对象分析以及良好速度(早期很多GC工具在这方面都很糟糕)的不错组合。而且它还是一个免费工具。

http://visualvm.java.net/download.html


这确实是一个不错的工具,我也在其中安装了Visual GC插件,但我仍然没有看到我想要的东西 - 即正在进行垃圾回收的哪些对象(来自哪些类)。 - duduamar
在进程的分析器页面上,选择内存分析,拍摄一个快照,然后您可以进行深入分析。此外,当您按内存使用排序时,通过上下跳动的对象,您还可以查看创建的临时对象最多的情况,并在GC之前和之后对其进行比较。如果您想知道“分配给哪个类”,恐怕目前没有任何现有的商业工具具备这样方便的功能。 - Alex Suo

0

要跟踪垃圾回收活动,请使用此命令:

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

我在日志中不分类名称。我可以看到有关收集的总对象数量的详细信息,但我没有找到与类相关的断点。 - duduamar

0

我会稍微有所不同地处理这个问题 - 你想知道的不是哪些对象被收集了,而是哪些对象占用了堆空间(但在下一次GC后被收集了)。

有许多工具可以让你检查堆中来自哪些对象和类,如Alex Suo提到的VisualVMJProfiler(一个不错但需要付费的应用程序),YourKit(同样需要付费)或jmap。使用其中任何一个工具,我会定期记录堆状态,以便与详细的垃圾回收日志进行交叉参考。

根据你的应用程序,你还可以结合应用程序的活动日志(哪些活动导致堆出现明显跳跃,特别是在稍后发生GC时有类似的减少)来使用详细的垃圾回收日志,从而取得相当大的进展。即使你使用上述工具,你的活动日志也可能是识别内存使用情况的关键。


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