我在 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”运行,也表示它已附加到进程,但然后阻塞并不再产生输出!
如何获取线程转储?
答案 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
答案 1 :(得分:0)
您是否尝试使用远程连接的VisualVM(/ usr / lib / java-6-sun / bin / jvisualvm)?它可以捕获线程转储