监视java线程执行的工具

时间:2011-01-14 03:38:42

标签: java performance jvm

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

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

我正在检查jconsolePSI Probe,但两者都没有提供有关应用程序内部哪些线程导致CPU使用异常的详细信息。

6 个答案:

答案 0 :(得分:5)

执行此操作的一种相对简单的方法(可能适用于您的情况也可能不适用)取决于行为发生的时间长度:

当您的应用展示您要调试的行为(在这种情况下,CPU使用率为90-100%)时,请在进程ID上使用jstack:

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

检查正在运行的线程以及它们发生的方法。如果你这样做几次,可能相对容易发现罪魁祸首的调用链。然后,您可以调试该链的入口。

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

答案 1 :(得分:4)

VisualVM正是您要找的。它附带了更新的JDK,允许您监视thread usage

答案 2 :(得分:3)

显示顶部cpu消耗线程的另一个工具是jvmtop

答案 3 :(得分:2)

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

 kill -QUIT [processId]

这将显示在进程'stdout。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

有一个名为“ threadcpu”的Linux工具,它可以测量每个线程的cpu使用情况。并且在使用Java线程的情况下,它使用jstack来获取并打印线程名称。

http://www.tuxad.com/blog/archives/2018/10/01/threadcpu_-_show_cpu_usage_of_threads/index.html