如何调试挂起的java线程?
我有以下问题:如何调试挂起的java线程?,java,multithreading,debugging,tomcat,Java,Multithreading,Debugging,Tomcat,我有以下问题: 我在Tomcat(Linux)中部署了一个web应用程序,在关闭Tomcat之后,如果我执行ps-ef操作,我仍然可以看到java进程正在运行。 我相信这是由于一些挂线造成的,但我不知道如何追踪这条线。 如何调试此问题 您可以如下所述生成4-5个线程转储,然后使用以下工具对其进行分析 您要检查的是,当发生卡住的线程或长时间运行的事务时,所有线程转储将显示某个线程id在java堆栈跟踪中的同一行。更简单地说,事务跨越多个线程转储,因此需要更多的调查 现在,当您运行这些时,它将以红色
我在Tomcat(Linux)中部署了一个web应用程序,在关闭Tomcat之后,如果我执行
ps-ef
操作,我仍然可以看到java
进程正在运行。我相信这是由于一些挂线造成的,但我不知道如何追踪这条线。
如何调试此问题 您可以如下所述生成4-5个线程转储,然后使用以下工具对其进行分析 您要检查的是,当发生卡住的线程或长时间运行的事务时,所有线程转储将显示某个线程id在java堆栈跟踪中的同一行。更简单地说,事务跨越多个线程转储,因此需要更多的调查 现在,当您运行这些时,它将以红色突出显示这些,以便您可以快速单击它并进入显示问题的行 请看一个例子。请看该链接中的武士输出图像。绿色细胞很好。红细胞和灰细胞需要观察 生成线程转储: (Linux) 如果JVM在控制台中运行,只需按
Ctrl-\
。
如果JVM在后台运行,则向其发送退出信号:
kill-QUIT进程\u id
process_id是正在运行的Java进程的进程号。线程转储也将被发送到标准输出重定向到的任何地方。
您通常可以使用以下命令获取所有正在运行的Java进程的进程号:
ps-axf | grep-java
您说您的java进程仍然存在,对吗?
进程只要有附加的线程就存在,对吗?
如果是这样,我会采取以下方法:
-在MBean服务器连接并由JVM内部管理的情况下运行该进程
然后在发送退出信号并获取线程转储(应该有一个JMX)后连接到进程。查看哪些线程看起来可疑
我想你也可以使用JVisualVM进行线程转储…这不是Jim要求的,他要求的是调试方法。@aviad:我做了一个
kill-3
并将javacore加载到Samurai。没有可视表,只有一个日志报告。我如何从该报告跟踪线程?你可以在Samurai中打开转储日志(使用文件->打开菜单)在堆栈跟踪中找到属于您的代码的有问题的行,然后尝试找出哪里出了问题/转到IDE,用断点锁定它并调试您的应用程序。@aviad:我已加载该文件,但我没有看到切换到IDE显示的选项。它像文本文件一样打开。我认为Samurai是一个分析工具-您必须调试它我不知道如何使用你推荐的方法这看起来更容易,但aviad已经建议过了:):至于JVisualVM方法,这里有一个教程。基本上,jvisualvm只是一个可执行文件,可以在$JAVA_HOME/bin文件夹中找到。。。运行它,连接到你的应用程序,看看你能用它做什么。非常强大的东西,真的:)如何使用JVisualVM
远程连接到linux安装中的tomcat?如何使用JVisualVM
加载javacore.pid.txt?