2011-02-17 34 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