【发布时间】: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