【问题标题】:Java - which objects are being garbage collected?Java - 哪些对象正在被垃圾收集?
【发布时间】:2014-11-18 08:05:33
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

    标签: java garbage-collection g1gc


    【解决方案1】:

    Oracle's JFR(Java Flight Recorder,或 Java Mission Control)是帮助完成这项任务的好工具 - 它显示每个对象的 GC 负载 - 表示每个类生成了多少对象(这与收集的对象)。非常推荐。

    【讨论】:

      【解决方案2】:

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

      您需要使用参数运行 JVM

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

      【讨论】:

      • 我没有在日志中分类名称。我看到有关收集了多少对象的详细信息,但我没有找到分类的中断。
      【解决方案3】:

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

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

      【讨论】:

      • 它确实是一个不错的工具,我还在其中安装了 Visual GC 插件,但我仍然看不到我想要的东西——哪些对象(来自哪些类)正在被垃圾收集。
      • 在进程的profiler页面,选择内存配置文件,做快照,你可以深入分析。此外,当您按内存使用情况排序时,在 GC 之前和之后,您还可以看到由对象上下跳跃创建的临时对象最多。如果要“从哪个类分配”,恐怕现有的商业工具都没有这样方便的功能。
      【解决方案4】:

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

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

      【讨论】:

      • 我没有在日志中分类名称.. 我看到有关收集了多少对象的详细信息,但我没有找到分类的中断
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        • 2012-07-09
        相关资源
        最近更新 更多