2011-01-14 76 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時,看看內存選項卡,並檢查堆的使用情況是否會很高。