当本机线程id与线程转储中列出的任何线程不匹配时,如何识别java进程中的线程?
上下文:在Windows上运行,我目前正在使用Sysinternals Process Explorer监视运行tomcat主机的java.exe,以获取我们在实验室中使用的webapp。我们目前正在观看这个,因为CPU配置文件最近一直很疯狂。
当服务器没有响应时,我查看java映像的属性,然后切换到线程选项卡,并按CPU列进行排序。通常会有一个TID - 例如62504 - 停在列表顶部或附近。我将TID转换为其十六进制表示(F428),检查线程转储 - 确定 “VM Thread”prio = 10 tid = 0x33d45000 nid = 0xf428 runnable
这让我觉得我的映射id的方法已经足够了。
但是因为我们现在专注于CPU,我也对本机线程61136感兴趣,它在运行一小时后内核时间超过5分钟。 61136 - > 0xEED0,但我的线程转储都没有包含nid = 0xeed0条目。
编辑:进一步测试显示StartAddress是一个关键信息 - 所有msvcr71.dll线程都出现在转储中或者生命周期很短,但是其他模块中的线程(mswsock.dll,kernel32.dll) )不要出现。主线程来自java.exe,但该模块中还有其他线程没有出现在线程转储中。
答案 0 :(得分:0)
61136 - > 0xEED0
(最后0是零,不是大写O)。这是你SO帖子中的拼写错误,还是你在代码/应用程序中犯了这个错误?