如何获得Jetty线程转储?

时间:2011-05-19 15:45:07

标签: jetty

我在 Sun的JVM 上的 Jetty 6.1.24-6 上运行了一个 Ubuntu Server 10.10 64位,两者都已安装来自标准的Ubuntu存储库。

我正在尝试追踪这个服务器的问题(一段时间后100%cpu,它可能与NIO的Selector上的一个已知错误有关,虽然它看起来像更改连接器到旧的io SocketConnector没有解决问题!),需要进行线程转储。

不幸的是我无法获得线程转储。我已经尝试向该进程发送 SIGQUIT ,并尝试将 JStack 附加到该进程,但这两种方法都不起作用。

我看不到来自SIGQUIT(在Jetty生成的任何日志文件中)和JStack的任何输出,即使以root(或jetty)和“-F”运行,也表示它已附加到进程,但然后阻塞并不再产生输出!

如何获取线程转储?

2 个答案:

答案 0 :(得分:6)

您必须以与Jetty进程运行相同的用户身份执行此操作。在Ubuntu上,这个用户通常被称为jetty。

所以试试

sudo -u jetty jstack <pid>

这会将一个线程转储发送到stdout(你的shell)。

你也可以

sudo -u jetty kill -QUIT <pid>

将线程转储发送到jetty的stdout(通常是/var/log/jetty/out.log

要使用jps命令或ps ax|grep java

,请使用pid

答案 1 :(得分:0)

您是否尝试使用远程连接的VisualVM(/ usr / lib / java-6-sun / bin / jvisualvm)?它可以捕获线程转储