jstack:目标进程没有响应

时间:2011-09-14 17:33:38

标签: java jstack thread-dump

我正在运行Ubuntu服务器版,我想采用Tomcat的线程转储。

所以,我首先尝试找出哪个PID tomcat使用:

$ jps -l
5809 sun.tools.jps.Jps

但它不存在?

所以,我使用top代替了找到了PID 5730。

然后我调用jstack来获取线程转储:

$ sudo jstack -l 5730
5730: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

发生了什么事? : - (

我已按照Jstack and Jstat stopped working with upgrade to JDK6u23中的说明尝试导出CATALINA_TMPDIR,但这并没有改变任何内容:

$ export CATALINA_TMPDIR=/tmp
$ sudo /etc/init.d/tomcat6 restart
 * Stopping Tomcat servlet engine tomcat6
   ...done.
 * Starting Tomcat servlet engine tomcat6
   ...done.
$ sudo jstack -l 5934 // new PID after restart
5934: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

更新

我也试过sudo -u tomcat6 jstack -l -F 5730 > threaddumpexceptions2.txt,但它只在控制台上给了我很多例外。

10 个答案:

答案 0 :(得分:67)

我通过做两件事来实现它:

  1. 将来电更改为:sudo -u tomcat6 jstack -J-d64 -m pid
  2. 将Sun的原始sun-6-jdk和sun-6-jre包替换为OpenJDK

  3. 第1部分的说明:我切换到64位模式,使用sudo并以Tomcat用户身份运行命令。

    注意:第2部分可能没有必要。对于一些用户来说,似乎第1部分就足够了。实际上,首先尝试添加sudo命令。它可能已经成功了。

答案 1 :(得分:30)

我认为你需要运行jstack作为运行Tomcat进程的同一个用户。另请注意,jps仅返回当前用户的进程。您可以通过使用sudo运行jps或作为Tomcat进程用户来获取Tomcat进程的pid。

此错误报告也可能有用:https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/597098

答案 2 :(得分:4)

@Valmar,我在这里找到相同的主题。 Unable to get thread dump? Any ideas why my app blocks?

似乎解决方法是sudo -u tomcat6 kill -3 <pid>

答案 3 :(得分:1)

这对我也很有用:

  

sudo -u tomcat6 kill -3 pid

看起来没有任何反应,但是当您查看日志时,堆栈就在那里。如果您不期待它们,它们看起来就像例外。

答案 4 :(得分:1)

我觉得使用类似&#39; ps -eo pid,user,command |这样的东西很有用grep java&#39;找到正在使用的实际java命令,然后使用该目录查找匹配的jstack等。

# ps -eo user,command | grep '[j]ava' | cut -d' ' -f1
someuser /usr/lib/jvm/java/bin/java

# /usr/lib/jvm/java/bin/java -version
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

所以它的64位,运行为&#39; someuser&#39;。 su到该用户并从同一目录运行jstack等。 (即/ usr / lib / jvm / java / bin / jstack

当您在具有各种不同Java安装/实现的服务器上时非常有用。

答案 5 :(得分:1)

尝试切换到流程用户,然后使用jstack:

sudo -u {process user} jstack&gt;转储

答案 6 :(得分:0)

我遇到了同样的问题,但以下解决方案的 none 对我有用:

jstack <pid>
jstack -J-d64 -m <pid>
sudo -u <user> jstack ...

我最终将JDK从 jdk1.6.0_24 升级到 jdk1.7.0_67 ,并且一切正常。

答案 7 :(得分:0)

对于遇到此问题的Tomcat用户,请检查catalina.out日志文件。

我遇到了同样的问题&#34; 22693:无法打开套接字文件:目标进程没有响应或HotSpot VM未加载&#34;。我放弃了,并试图找到任何关于它被锁定之前发生的事情,但随后在日志文件中有jstack输出。

答案 8 :(得分:0)

对于那些在被问及 CentOS 7 六年后发现这个答案的人,请注意SELinux会阻止jmap编写堆转储,因为开箱即用,它将拒绝写入套接字,除非该目录具有类型tomcat_tmp_t

就我而言,我在/usr/share/tomcat/.jmap下编写了我的堆转储。该目录由我的运行时用户拥有。

因此,允许jmap写入此目录:

semanage fcontext -a -t tomcat_tmp_t "/usr/share/tomcat/.jmap(/.*)?"
restorecon /usr/share/tomcat -vR

这使我们可以像我们的tomcat用户一样运行:

jmap -dump:format=b,file=/usr/share/tomcat/.jmap/tomcat-`date +%s`.bin <pid>

答案 9 :(得分:0)

我的问题是,我在终端上运行了该进程。然后,为了测试其jstack,我以ctrl+z暂停了该过程。该过程无法响应。为了解决此问题,我通过fg恢复了该过程,并通过另一个终端检查了它的jstack。