2011-02-17 26 views
2

當本機線程ID與線程轉儲中列出的任何線程不匹配時,如何在java進程中標識線程?將缺少的本機線程ID映射到線程轉儲

上下文:在Windows上運行時,我正在使用Sysinternals Process Explorer監視運行tomcat主機的java.exe,以查找我們在實驗室中使用的webapp。我們目前正在觀察這一點,因爲CPU配置文件最近一直很瘋狂。

當服務器沒有響應時,我查看java圖像的屬性,並切換到線程選項卡,然後在CPU列中對其進行排序。通常會有一個TID - 例如62504 - 停在列表頂部或附近。我的TID轉換成其十六進制表示(F428),檢查線程轉儲 - 果然 「VM線程」 PRIO = 10 TID = 0x33d45000 NID = 0xf428可運行

這讓我覺得,我的映射IDS的方法是適當的。

但是因爲我們現在專注於CPU,所以我也對本地線程61136感興趣,它在運行一小時內超過了5分鐘的內核時間。 61136 - > 0xEED0,但是我的線程轉儲沒有包含nid = 0xeed0條目。

編輯:進一步的測試表明,StartAddress是一個重要的信息 - 所有的msvcr71.dll線程出現在轉儲中或具有很短的生命週期,但其他模塊中的線程(mswsock.dll,kernel32.dll)不會出現。主線程來自java.exe,但該模塊中還有其他線程不會出現在線程轉儲中。

回答

0

61136 - >0xEED0(該最後的0是零,而不是大寫的O)。這是你SO貼子中的錯字,還是你在代碼/應用程序中犯了這個錯誤?

+0

我幾乎可以肯定這只是一篇文章中的轉錄錯誤,但您已經足夠激起我的偏執狂,因此我需要重新運行實驗。 – VoiceOfUnreason 2011-02-18 06:15:14