2010-03-02 38 views
2

我有一個web應用程序在jboss應用程序服務器上運行(但它不是特定的jboss,所以我們也可以認爲它是一個tomcat或任何其他服務器)。現在我遇到了一個線程似乎處於死鎖狀態的問題。它始終使用100%的CPU。我已啓動具有啓用調試端口的服務器,並且可以將Eclipse連接到它。但問題是:有很多線程在運行。我如何找到正確的線程?我知道進程ID(來自Linux「top」命令),但我認爲這沒有幫助。我真的必須單獨打開每個線程,並檢查他們目前正在做什麼?或者有沒有一種方法來過濾「最活躍」的線程或類似的東西在Eclipse中?如何在Eclipse遠程調試器中發現有問題的線程?

回答

2

您可以嘗試生成線程轉儲(CTRL + Break,如this thread所示)。

或者您可以將JConsole附加到遠程會話(因此暫時擱置Eclipse),監視線程並生成線程轉儲。

alt text http://www.jroller.com/dumpster/resource/tdajconsole.png

+1

一個簡單的線程轉儲確實是我所需要的。爲了找到使用這麼多CPU的線程,我可以在Linux上使用程序「htop」,它也可以顯示和CPU使用 - 排序線程(而不僅僅是「top」)。所以htop給了我一個線程ID,並且這個線程ID也可以在線程轉儲中找到,它給了我有問題代碼的堆棧跟蹤。完善。 – kayahr 2010-04-11 14:55:51

1

好像是你需要確定哪個線程首先吃CPU來縮小範圍到具有錯誤的代碼,那麼該代碼是由該線程,並在這一點上,你可以執行遠程調試。

我會建議使用像JProfiler,jvisualvm,jconsole或類似的東西。使用這些工具之一可以讓你深入瞭解線程正在做什麼,並且允許你通過使用的cpu循環對線程進行排序,因此您可以快速找到有問題的線程。