jstack原理
what:
jstack是java进程中当前线程的运行情况查看工具
区别其他工具:
jmap:Java进程内存分配查看工具,常用命令:jmap [ option ] pid
jstat:可以实时监控java进程的资源和性能,可以观察classloader、compiler、gc的相关信息
where
jstack在分析java进程CPU占用过高时,是一种不错的选择。使用该工具可以查看到java进程中,具体那个线程异常,并且有对应的堆栈。具体使用见:https://www.cnblogs.com/sfzlstudy/p/15814483.html
how:
jstack等命令会与jvm进程建立socket连接,发送对应的指令(jstack发送了threaddump指令),然后再读取返回的数据。
jstack有两种实现方式,一种是基于attach api,在tools.jar里可以找到,一种是基于SA的实现在sa-jdi.jar里。我们分析attach api的源码:
很多命令都是通过 executeCommand 来实现的,例如:datadump、threaddump、dumpheap、inspectheap、jcmd等,而最终的execute()在Mac机器上是由 BsdVirtualMachine 类来完成。