我的应用程序有很多垃圾收集,我想分析一下。我想看看哪些对象正在被垃圾收集。我认为这会让我知道在哪里寻找优化(添加缓存或其他)。
是否有打印详细 GC 信息的选项,包括每个类中有多少对象被垃圾回收?
如果这很重要,我正在使用 G1GC。
谢谢!
我的应用程序有很多垃圾收集,我想分析一下。我想看看哪些对象正在被垃圾收集。我认为这会让我知道在哪里寻找优化(添加缓存或其他)。
是否有打印详细 GC 信息的选项,包括每个类中有多少对象被垃圾回收?
如果这很重要,我正在使用 G1GC。
谢谢!
Oracle 的 JFR(Java Flight Recorder,或 Java Mission Control)是一个很好的工具来帮助完成这项任务——它显示了每个对象的 GC 负载——这意味着每个类生成了多少对象(这与收集的对象一起)。非常推荐。
我不确定 G1GC,但通常我发现 VisualVM 工具包很有帮助。它是良好特性、足够深入的对象分析以及良好速度的良好组合(早期的许多 GC 工具对此很烂)。它也是一个免费工具。
要跟踪垃圾收集活动,请使用以下命令:
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails
我会以稍微不同的方式处理这个问题 - 你不是很想知道哪些对象正在被收集,而是哪些对象正在占用堆(但在下一次 GC 之后被收集)。
有许多工具可以让您检查来自堆中的对象和类,如上面 Alex Suo 提到的VisualVM 、 JProfiler(很好,但需要付费的应用程序)、YourKit(相同)或 jmap。使用其中任何一个,我会定期记录堆状态,您可以与详细的垃圾收集日志进行交叉引用。
根据您的应用程序,您还可以将详细的垃圾收集日志与应用程序的活动日志结合使用,从而取得相当大的进展(哪些活动会导致堆中明显的跳跃,特别是在稍后发生 GC 时出现类似减少的情况)。即使您使用上述工具,您的活动日志对于确定内存使用的来源也可能至关重要。