2011-01-14 78 views
6

我有一个运行在Tomcat服务器(Linux)上的java web应用程序。在生产环境中,我正面临一些性能问题。在随机时间间隔内,运行tomcat的jsvc进程开始以90-100%的CPU运行。我无法找到此事件的触发器。该服务器是一个四核心系统。内存消耗不表示任何异常。监视java线程执行的工具

如何监视应用程序中的哪个线程(应用程序堆栈跟踪)导致问题?

我在检查jconsolePSI Probe,但都没有给出有关应用程序内部哪些线程导致CPU使用异常的任何详细信息。

+0

与`[JavaScript的性能]`标签是什么? – skaffman 2011-01-14 04:11:03

+0

@skaffman,对不起java性能,我已经纠正它。 – 2011-01-14 04:13:08

回答

5

一个相对简单的方式来做到这一点(这可能会或可能不适合你的情况下工作 - 取决于多久时出现的问题):

当你的应用表现出在这种情况下,你要调试的行为( ,90-100%的CPU使用)使用jstack的进程ID:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

检查什么的线程运行,以何种方式,他们发生。如果你这样做了几次,发现罪魁祸首的链条可能相对容易。然后您可以调试该链的入口。

这不一定是最好的或最优雅的方法,但它很容易做,它可能是你所需要的。我会从那里开始。这与“printf是我曾经使用过的最好的调试器”哲学类似。

2

通过发送一个QUIT信号,您可以获得任何Java应用程序中所有线程的堆栈跟踪转储。

kill -QUIT [processId] 

这将显示在过程'标准输出。

1

只是我的2美分,但我想知道,如果你没有试验内存问题的CPU高峰可能是GC活动。所以,当你用jconsole监视你的tomcat时,看看内存选项卡,并检查堆的使用情况是否会很高。