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