Tomcat 线程转储

Posted

技术标签:

【中文标题】Tomcat 线程转储【英文标题】:Tomcat thread dump 【发布时间】:2013-09-05 13:46:44 【问题描述】:

是否可以从 Tomcat 中获取 线程转储?我想在某个时间点监控Tomcat中运行的线程。

注意:我在 Web 逻辑上执行此操作,但我不知道如何在 Tomcat 上执行此操作。

【问题讨论】:

【参考方案1】:

有一种简单的方法可以监控 tomcat 线程并进行转储。 使用以下 java 选项启动 tomcat:

-Dcom.sun.management.jmxremote.port=<some free port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

tomcat 重新启动后,您可以简单地启动 jconsole(jdk 的一部分)或 visualvm 并创建一个新的 jmx 连接到您在上面选择的端口。 在这两种工具中,您还可以选择进行转储;)

!!!但是只能在封闭/安全的环境中这样做 - 因为没有设置身份验证。!!!

【讨论】:

【参考方案2】:

如果您使用 Linux,您可以发送 kill -3 [您的 tomcat 的 pid],它将转储 catalina.out 中的所有当前线程。

【讨论】:

我想补充一点,它可能是catalina.out 确实不错。 更好的答案在这里:***.com/questions/4876274/…【参考方案3】:

以下步骤应该可以帮助您让当前的 Java 线程运行并分析它们:

    从IBM Thread & Dump Monitor Analyzer 下载 IBM JCA,这是一个不错的线程转储分析器 执行以下命令以获取 Tomcat 线程转储:root@localhost:~# sudo -u $TOMCAT_USER $JAVA_HOME/bin/jstack -J-d64 -l $(ps aux | grep '[c]atalina' | awk 'print $2') &gt; ~/threads.log 使用IBM Thread & Dump Monitor Analyzer 打开线程转储

注意:$JAVA_HOME 替换为当前JDK 的路径,$TOMCAT_USER 替换为运行Tomcat 的用户;如果您传递了错误的用户,甚至使用 root,您将收到如下错误:

3047: well-known file is not secure

【讨论】:

【参考方案4】:

将 Java 旋律添加到您的服务器 https://code.google.com/p/javamelody/

它为您提供了很多信息,包括运行时的线程

【讨论】:

【参考方案5】:

请尝试使用 netbeans 分析器来分析任何 Web 应用程序。

https://profiler.netbeans.org/

http://wiki.netbeans.org/FaqProfilerAttachRemoteServer

【讨论】:

以上是关于Tomcat 线程转储的主要内容,如果未能解决你的问题,请参考以下文章

如何指出是啥在线程转储文件中将线程置于 WAITING 状态

Tomcat 没有响应

多线程程序的核心转储

线程转储分析

什么时候应该为JVM采用线程转储

java线程转储“等待条件”的意义