4

我的应用程序有很多垃圾收集,我想分析一下。我想看看哪些对象正在被垃圾收集。我认为这会让我知道在哪里寻找优化(添加缓存或其他)。

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

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

谢谢!

4

5 回答 5

2

Oracle 的 JFR(Java Flight Recorder,或 Java Mission Control)是一个很好的工具来帮助完成这项任务——它显示了每个对象的 GC 负载——这意味着每个类生成了多少对象(这与收集的对象一起)。非常推荐。

于 2016-02-24T13:51:50.993 回答
1

这一直是那里的答案: 如何打印 java 类垃圾收集事件?

您需要使用参数运行 JVM

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
于 2014-11-18T08:08:29.947 回答
0

我不确定 G1GC,但通常我发现 VisualVM 工具包很有帮助。它是良好特性、足够深入的对象分析以及良好速度的良好组合(早期的许多 GC 工具对此很烂)。它也是一个免费工具。

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

于 2014-11-18T08:08:34.740 回答
0

要跟踪垃圾收集活动,请使用以下命令:

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
于 2014-11-18T08:18:46.833 回答
0

我会以稍微不同的方式处理这个问题 - 你不是很想知道哪些对象正在被收集,而是哪些对象正在占用堆(但在下一次 GC 之后被收集)。

有许多工具可以让您检查来自堆中的对象和类,如上面 Alex Suo 提到的VisualVM 、 JProfiler(很好,但需要付费的应用程序)、YourKit(相同)或 jmap。使用其中任何一个,我会定期记录堆状态,您可以与详细的垃圾收集日志进行交叉引用。

根据您的应用程序,您还可以将详细的垃圾收集日志与应用程序的活动日志结合使用,从而取得相当大的进展(哪些活动会导致堆中明显的跳跃,特别是在稍后发生 GC 时出现类似减少的情况)。即使您使用上述工具,您的活动日志对于确定内存使用的来源也可能至关重要。

于 2014-11-18T10:04:47.617 回答