2011-05-19 59 views
4

我有一个Ubuntu服务器10.10 64位Sun的JVM,无论是从标准的Ubuntu安装库上运行码头6.1.24-6一个Web应用程序。如何获得Jetty线程转储?

我试图追查这个服务器的问题(一段时间后100%cpu,它可能与NIO的选择器上的已知错误有关,尽管它看起来像将连接器更改为旧的io SocketConnector没有解决问题!),并需要采取线程转储。

不幸的是我无法获得线程转储。我试图发送一个SIGQUIT到该过程,并试图将JStack附加到它,但这两种方法都不起作用。

我根本看不到SIGQUIT的输出(在由Jetty生成的任何日志文件中),而JStack甚至以root(或jetty)的形式运行,并以“-F”表示,它已被附加到该过程,但然后阻止并不会产生更多的输出!

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

+0

看到这里我的问题,我采取了一些线程转储,可能会帮助你:http://stackoverflow.com/questions/7404844/jetty-service-thread-crashes-and-uses-100-cpu – gubby 2011-09-13 16:01:36

回答

0

你用远程连接试过VisualVM(/ usr/lib/java-6-sun/bin/jvisualvm)吗?它可以捕获线程转储

+0

我不知道为什么,但它不起作用。我向JVM添加了一些-D参数,端口1099在服务器上打开。我在VisualVM上添加了一个连接,它说“连接...”,但永远不会走得更远。更奇怪的是,连接确实已建立,如客户端(我的机器)和服务器上的'netstat'所示! – 2011-05-19 18:21:07

+0

你是如何建立连接的?通过JMX或jstatd守护进程? – Grooveek 2011-05-19 19:46:24

+0

1099似乎是rmi注册表的一个端口......您在JMX连接中配置了什么网址? – Grooveek 2011-05-19 19:48:09

5

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

所以尽量

sudo -u jetty jstack <pid> 

这将线程转储发送到标准输出(你的shell)。

您也可以

sudo -u jetty kill -QUIT <pid> 

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

来获得的PID使用jps命令或ps ax|grep java

+0

'''ps ax | grep java'''通常会输出多个进程,我应该使用哪一个进程? – 2017-01-26 18:22:22

+0

看看命令行参数 – 2017-01-26 21:02:53