线程转储
我对LINUX + Java 6中,这似乎被卡住运行一个独立的Java应用程序(没有生成日志) 我如何可以利用这个线程转储,而无需使用任何其他工具(如jstack)线程转储
尝试下面的命令,但他们没有做任何事情
kill -3 <pid>
kill -QUIT <pid>
我错过了什么?
您可以使用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的(在你的客户),并添加一个连接。
在远程服务器上工作,但没有VisualVM。 – 2012-03-14 10:47:29
在您的远程服务器上,您只需启用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
看到堆栈跟踪。
问候。
不在root中,但与该进程的所有者具有相同的用户。 – 2012-03-14 10:48:09
那'kill -9'(SIGKILL)呢?这将无条件地杀死这个过程。 – 2012-03-14 11:04:33
@ Christian.K我认为他想一个线程转储,而不是仅仅杀死进程 – ssedano 2012-03-14 12:36:57
好的。得到它了。 “Ctrl + \”给我转储。 – 2012-03-14 10:15:24
请将您的评论转换为答案并自行接受。 – 2012-03-14 10:16:23
'杀-3'也应该工作。唯一不行的是当你看不到控制台时。 – 2012-03-14 10:17:46