【问题标题】:Java GC is high, how to find out which objects are GCedJava GC高,如何找出哪些对象被GC
【发布时间】:2018-03-21 07:13:23
【问题描述】:

我有一个用 Tomcat Webserver 构建的 Java 应用程序。 使用 Java 任务控制我知道在压力下,GC 非常占主导地位。每个 GC 周期,CPU 都会变得非常高。 我想弄清楚的是,每个 GC 周期到底在做什么,特别是,我想知道它正在提升哪个对象,以及它正在释放哪些对象。对于被释放的对象,我不仅想知道它们是什么类型,还想知道它们是在哪里创建的。仅仅知道我有很多 byte[] 或 Strings 显然没有帮助,因为有很多地方可以创建它们,但只有少数几个在我的控制范围内并且占主导地位。

有没有人知道这样做的工具或方法。

提前致谢。

【问题讨论】:

  • 你用过Flight recording吗?
  • 是的,Flight Recorder 是我发现 GC 导致 CPU 峰值的方式。但是 JFR 没有提供我需要/描述的信息。或者至少我不知道如何获取这些信息
  • GC 日志以及您的 JFR 配置文件足以了解原因。
  • 确保启用 JFR 事件类型“Allocation in new TLAB”和“Allocation outside TLAB”。在 JMC 6(JDK 9 附带,但也可以查看 JDK 7/8 记录)中,您可以查看 Memory 页面,并在 Stacktrace 视图中查看您的分配站点。

标签: java performance memory-management garbage-collection jvm


【解决方案1】:

您需要记录对象分配,而不是收集的内容。渐近收集和分配是相同的,但后者在发生时可以提供更多信息。

各种 java 分析解决方案都提供了这种能力。

【讨论】:

    【解决方案2】:

    选项 1 - 使用 Java Flight Recorder allocation profiling option。我知道您对死对象感兴趣,但诀窍是大多数新对象很快就会死。

    选项 2 - SJK 死对象直方图。 SJK 采用很少的堆类直方图(与jmap -histo 相同)并报告差异。它具有计算死亡人数和年轻死亡人数的选项。

    【讨论】:

    • “分配分析选项”链接现已失效。能否更新一下并引用相关内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2018-10-01
    相关资源
    最近更新 更多