以线程转储生产(Taking thread dumps in production)

2019-07-17 18:20发布

我分析采取线程转储方式之间的差异。 下面是他们夫妇的我的研究

  1. 定义一个JMX Bean上的点击声明豆操作触发jstack通过的Runtime.exec()。

  2. 守护线程执行“ManagementFactory.getThreadMXBean()。dumpAllThreads(真,真)”反复的预定时间间隔后。

线程转储输出两者之间的比较,我就看到了下面的缺点的方法2

  1. 登录与方法2线程转储不能开源线程转储分析器像TDA解析
  2. 在输出中不包括可以在分析高CPU的问题是有用的本地线程ID(右?)
  3. 还有吗?

我将不胜感激就获得建议/输入

  1. 有没有通过的Runtime.exec()在生产代码执行jstack的任何缺点? 各种操作系统的任何兼容性问题 - 在Windows,Linux?

  2. 任何其他办法,采取线程转储?

谢谢。

编辑-

1和2相结合的办法似乎是要走的路。 我们可以有一个专门的线程在后台运行,并打印在由线程转储分析器理解的格式的日志文件中的线程转储。 如果有任何额外的信息需要(如说可能是本地线程ID),它是由jstack只输出记录,我们做手工的要求。

Answer 1:

您可以使用

jstack {pid} > stack-trace.log

运行作为其中的进程正在运行输入框中输入用户。

如果你运行这个多次,你可以使用diff ,看看哪个线程是活动的更容易。


为了分析堆栈跟踪我使用一个专用线程周期性采样以下。

 Map<Thread, StackTraceElement[]> allStackTraces = Thread.getAllStackTraces();

使用此信息,您可以获取线程的ID,运行状态和比较堆栈跟踪。



Answer 2:

与Java 8中的画面,jcmd是首选的方法。

jcmd <PID> Thread.print

以下是摘录Oracle文档 :

JDK 8的发布介绍了Java的Mission Control,Java的飞行记录,并jcmd工具用于诊断与JVM和Java应用程序的问题。 建议使用最新的工具,jcmd而不是为增强诊断和降低性能开销以前jstack实用程序。

然而,随着应用出货,这可能是其授权我不知道意义。



Answer 3:

如果它是一个* nix中我会尝试kill -3 <PID>但你需要知道进程的ID,也许你没有访问控制台?



Answer 4:

我建议你做的所有堆分析上登台环境,如果有这样的ENV,则反映生产如有您所需的应用程序服务器调整。 如果您需要为您的应用程序的内存使用率的分析转储,那么也许你应该考虑剖析它更好的分析。

堆转储通常作为结果生成OutOfMemoryExceptions从存储器泄漏和不良存储器管理所得。

检查您的应用程序服务器的文档,最现代化的服务器有从我前面提到的正常原因搁置在运行时产生转储手段,产生的垃圾可能是,虽然供应商特定的。



文章来源: Taking thread dumps in production