Java - 哪些对象被垃圾收集?

时间:2014-11-18 08:05:34

标签: java garbage-collection g1gc

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

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

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

谢谢!

5 个答案:

答案 0 :(得分:1)

这是答案: Howto print java class garbage collection events?

您需要使用参数

运行JVM
-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我不确定G1GC但通常我发现VisualVM工具包非常有帮助。它具有良好的功能,足够深入的对象分析以及良好的速度(很多GC工具在早期就很糟糕)。它也是一种免费工具。

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我的处理方式略有不同 - 你不想知道收集了哪些对象,但是哪些对象占用了堆(但是在下一次GC之后收集了)。

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

根据您的应用程序,您还可以使用详细的垃圾收集日志以及应用程序的活动日志(在堆中引起明显跳转的活动,特别是在出现类似减少的情况下),取得相当大的进展。 GC后来发生)。即使您使用上述工具,您的活动日志也可能对于确定内存使用的来源至关重要。