【发布时间】:2012-12-16 14:29:31
【问题描述】:
我正在分析进行线程转储的方法之间的差异。以下是我正在研究的其中几个
定义一个 jmx bean,在单击声明的 bean 操作时通过 Runtime.exec() 触发 jstack。
在预定义的时间间隔后重复执行“ManagementFactory.getThreadMXBean().dumpAllThreads(true, true)”的守护线程。
比较两者之间的线程转储输出,我发现方法 2 存在以下缺点
- 使用方法 2 记录的线程转储无法被 TDA 等开源线程转储分析器解析
- 输出不包括在分析高 CPU 问题时可能有用的本机线程 ID(对吗?)
- 还有吗?
我希望得到有关方面的建议/意见
在生产代码中通过 Runtime.exec() 执行 jstack 有什么缺点吗?各种操作系统(windows、linux)上的兼容性问题?
还有其他获取线程转储的方法吗?
谢谢。
编辑 -
1 和 2 的组合方法似乎是要走的路。我们可以在后台运行一个专用线程,并以线程转储分析器可以理解的格式在日志文件中打印线程转储。 如果需要任何仅由 jstack 输出记录的额外信息(比如可能是本机线程 id),我们会根据需要手动执行。
【问题讨论】:
-
这是否与 JEE 应用程序有关?
标签: java runtime.exec thread-dump