在Linux/HotSpot虚拟机上,top -H可以列出某个java进程的所有线程,因此可以找到繁忙线程的线程id,因此我可以使用这个线程id在jstack输出中找到java线程( jstack中的nid是top -H中线程id的十六进制转换)。
而MacOS平台上的Hotspot VM实现在使用jstack获取Java线程统计数据时使用pthread_t作为nid,与MacOS上的top -H没有任何相似之处。那么,有没有办法在没有MXBean的情况下找到“繁忙”的Java线程呢?
或者有人能告诉我如何在MacOS上找到繁忙的Java线程的'nid',根据它我可以通过jstack找到相应的Java线程?
发布于 2019-09-25 07:54:13
一个小更正:在macOS上,nid不是pthread_t,而是pthread_mach_thread_np(pthread_t)获得的一个线程端口。
无论如何,不幸的是,在macOS上没有top -H的等价物。但是,如果您只是想找到一个繁忙的Java线程,则不需要。请改用Java分析器。
下面是如何使用async-profiler实现这一点
./profiler.sh -d 10 -t -f profile.svg PID这意味着:在线程模式(-t)下对Java process PID进行10秒(-d 10)的分析,并将输出作为Flame Graph保存到profile.svg。你甚至不需要jstack -这个概要文件已经突出显示了最热门的线程和它们的Java堆栈跟踪。

作为火焰图的替代方案,您可以选择“传统”树视图
通过指定-f profile.html而不是-f profile.svg。
https://stackoverflow.com/questions/58083047
复制相似问题