【问题标题】:Taking periodic thread dumps on JVM - ThreadMXBean vs JVMTI agent [duplicate]在 JVM 上进行定期线程转储 - ThreadMXBean 与 JVMTI 代理 [重复]
【发布时间】: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


【解决方案1】:

取决于您想要的采样频率,但在大多数情况下,它会产生一些影响并且结果会有所偏差。不过,如果您喜欢 JVMTI,请务必查看 Honest Profiler:https://github.com/RichardWarburton/honest-profiler

【讨论】:

  • 谢谢。很高兴了解安全点和 AsyncGetCallTrace。这对我的研究非常有用。
  • AsyncGetCallTrace 适合分析。但是,它不会创建线程转储。 IE。 AsyncGetCallTrace 可以很好地跟踪活动线程,但它不会提供所有线程的图片。
  • 同意。我的用例主要用于分析需求,而不是查看所有线程在特定时刻所做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2016-09-14
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多