线程转储

线程转储

问题描述:

我对LINUX + Java 6中,这似乎被卡住运行一个独立的Java应用程序(没有生成日志) 我如何可以利用这个线程转储,而无需使用任何其他工具(如jstack)线程转储

尝试下面的命令,但他们没有做任何事情

kill -3 <pid> 
kill -QUIT <pid> 

我错过了什么?

+1

好的。得到它了。 “Ctrl + \”给我转储。 – 2012-03-14 10:15:24

+0

请将您的评论转换为答案并自行接受。 – 2012-03-14 10:16:23

+0

'杀-3'也应该工作。唯一不行的是当你看不到控制台时。 – 2012-03-14 10:17:46

您可以使用Java的VisualVM(包含在每一个JDK的bin目录),并通过JMX连接。只需将您的JVM启动参数(在远程主机上)添加到

-Dcom.sun.management.jmxremote.port=PORT 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 

并启用身份验证。

然后启动VisualVM的(在你的客户),并添加一个连接。

在这里看到:http://visualvm.java.net/docindex.html

+0

在远程服务器上工作,但没有VisualVM。 – 2012-03-14 10:47:29

+0

在您的远程服务器上,您只需启用jmx支持,如上所示。你的客户不是使用xserver吗? – Stefan 2012-03-14 10:57:15

获取从jps命令的PID(虽然不是必要的)。

你有没有试着用root权限?如果java进程是以root(或守护进程)权限启动的,则必须考虑到这一点。

# kill -3 <pid> 
$ sudo kill -QUIT <pid> 

您还可以看到在top输出线按H(不h)。

然后,如果你识别出卡,你可以抓住的PID,使十六进制,然后用jstack看到堆栈跟踪。

问候。

+0

不在root中,但与该进程的所有者具有相同的用户。 – 2012-03-14 10:48:09

+0

那'kill -9'(SIGKILL)呢?这将无条件地杀死这个过程。 – 2012-03-14 11:04:33

+0

@ Christian.K我认为他想一个线程转储,而不是仅仅杀死进程 – ssedano 2012-03-14 12:36:57