it-swarm.cn

jstack:目标进程无响应

我正在运行Ubuntu服务器版,并且想进行Tomcat的线程转储。

因此,我首先尝试找出Tomcat使用的PID:

$ 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

这是怎么回事? :

我已经尝试按照---中的描述导出CATALINA_TMPDIR((Jstack和Jstat停止了升级到JDK6u23的工作) ,但这没有任何改变:

$ 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,但它只给我带来了控制台上的大量异常。

44
Timo

我通过做两件事使它工作:

  1. 通话更改为:Sudo -u Tomcat6 jstack -J-d64 -m pid
  2. 用Sun的原始Sun-6-jdk和Sun-6-jre软件包替换了OpenJDK

第1部分的解释我切换到64位模式,使用Sudo并以Tomcat用户身份运行命令。

注:可能不需要第二部分。对于某些用户来说,第1部分就足够了。实际上,尝试首先仅添加Sudo命令。它可能已经成功了。

68
Timo

我认为您需要以与运行Tomcat进程相同的用户身份运行jstack。还要注意,jps仅返回当前用户的进程。您可以通过使用Sudo或以Tomcat进程用户身份运行jps来获取Tomcat进程的pid。

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

30
Michael Pigg

@Valmar,我在这里找到相同的主题。 无法获取线程转储?为什么我的应用程序会阻塞?

似乎解决方法是Sudo -u Tomcat6 kill -3 <pid>

3
Clark Bao

我发现使用'ps -eo pid,user,command | grep Java'查找实际使用的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位以“ someuser”身份运行。 su到该用户,然后从同一目录运行run jstack等。 (即/ usr/lib/jvm/Java/bin/jstack

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

1
Cameron Kerr

这也对我有用:

须藤-u Tomcat6 kill -3 pid

看起来什么都没有发生,但是当您查看日志时,堆栈就在那里。如果您不期望它们,它们看起来就像是例外。

1
Ted Bigham

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

Sudo -u {进程用户} jstack>转储

1
Joshua

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

我遇到了同样的问题:“ 22693:无法打开套接字文件:目标进程未响应或HotSpot VM=未加载。”。起来,但是在日志文件中有jstack输出。

0
John C

对于那些在被问到六年后找到答案的人,他们使用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>
0
Ron

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

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

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

0
MK Aftab