我正在运行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,但它在控制台上只给了我很多异常(exception)。

最佳答案

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

  • 更改为:sudo -u tomcat6 jstack -J-d64 -m pid
  • 用Sun的原始sun-6-jdk和sun-6-jre软件包
  • 替换了OpenJDK


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

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

    10-04 12:00