2011-09-24 58 views
1

我在我的java應用程序上運行jstack(在tomcat和ubuntu服務器版上運行),因爲它似乎在一段時間後消耗了大量內存。如何找到通過jstack找到的阻塞線程的原因?

因此,與jstack我發現,許多線程似乎被阻止:

控制檯日誌http://dl.dropbox.com/u/17844821/zeug/threaddumpexception.txt

Threaddumphttp://dl.dropbox.com/u/17844821/zeug/threaddump.txt

所以,我知道線程被阻塞但我怎麼才能找出哪些Java類導致這一點,甚至更重要:我如何強制這些線程終止?

任何幫助將不勝感激。

回答

2

後來才知​​道通過jstack產生的threaddump是不正確的。

我必須做兩件事情,以獲得正確的轉儲:

  1. 與太陽的原始太陽6 JDK和太陽6 JRE包換成了OpenJDK
  2. 我修改了jstack調用使用64位模式,並像這樣運行它爲tomcat用戶:sudo -u tomcat6 jstack -J-d64 -m pid

這給了我一個看起來正確的threaddump(沒有阻塞的線程)。

0

我認爲這些線程正在等待一些正常的IO(套接字,記錄器等)。

通常,當一個線程被阻塞時,jstack將顯示完整的堆棧,直到塊調用。

您可以分析堆棧並檢查呼叫跟蹤,並確定此線程是否被某個錯誤/問題阻止或者它是正常執行的服務器或應用程序。

[]的,

和過去的

+0

你確定嗎?那裏有很多線索。除此之外,我的應用程序運行時間越來越慢,似乎消耗越來越多的內存(當我在命令行中使用'top'時,我可以看到它)。 – Timo

+0

使用一些grep,sed或其他腳本來過濾來自jstack輸出的內容。或者,使用一些圖形工具(jconsole,...)來分析線程的jvm狀態和內存使用情況。 – apast