【发布时间】:2016-12-09 13:38:49
【问题描述】:
我正在尝试构建一个系统,该系统在 JVM 进程上进行定期线程转储,以便以后可以在出现问题时对其进行分析。我打算在进行线程转储时对 JVM 造成最小的开销。有多种方法可以进行线程转储,我最终列出了 2 个选项 - 构建自定义 JVMTI 代理或使用 ThreadMXBean。我想知道是否有人分析过哪种方法会导致最少的 JVM 开销?还是它们会导致相同的开销?
【问题讨论】:
-
ThreadMXBean是获取线程转储的最糟糕方法。它构建了堆栈跟踪的 Java 级表示,这就是它速度慢并在堆中创建大量垃圾的原因。 JVMTI 是一种更好的方式。但是,更好的是让 JVM 为您进行堆栈跟踪(请参阅链接的答案)。 -
感谢您链接问题。询问 JVM 意味着等待安全点,在我的(分析)用例中,这不是必需的。我实际上已经开始考虑使用性能工具或 DTrace。
-
如果堆栈跟踪的主要目的是 CPU 分析,那么您可能需要解释这个问题。以目前的形式,这个问题确实已经得到了回答。
-
关于profiling,我可以推荐this post。
-
谢谢。真的很有用。
标签: java performance monitoring jmx jvmti