如何获得Jetty线程转储?

Bru*_*eis 4 jetty

我在Sun的JVM上的Jetty 6.1.24-6上运行了一个64位Ubuntu Server 10.10,它们都是从标准的Ubuntu存储库安装的.

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

不幸的是我无法获得线程转储.我试图将SIGQUIT发送到进程,并尝试将JStack附加到它,但两种方法都不起作用.

我看到SIGQUIT(在Jetty生成的任何日志文件中)都没有输出,而JStack,即使以root(或jetty)和"-F"运行,也说它已附加到进程,但是然后阻止并不再产生输出!

我怎样才能获得线程转储?

Dr.*_*ibo 6

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

所以试试吧

sudo -u jetty jstack <pid>
Run Code Online (Sandbox Code Playgroud)

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

你也可以

sudo -u jetty kill -QUIT <pid>
Run Code Online (Sandbox Code Playgroud)

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

要获取pid,请使用jps命令或ps ax|grep java