jstack
对java应用,主要是堆、栈、容器来排查
容器就是tomcat
为什么要看栈?(什么情况看栈)
java应用有瓶颈,是通过查看各个线程的调用栈在等待什么或者在做什么,
若usrcpu消耗多,看看线程在做什么操作,在等待什么,那么rt时间长,也可以去分析线程,为什么会有长时间,站在线程角度,可能是发生死锁、阻塞、存在锁之间的竞争,请求资源一直等待。
可以用命令、也可以工具,命令与工具差不多。
jstack作用用于生成虚拟机当前时刻所有线程运行状态的快照
也叫threaddunmp,包括每一个线程调用栈,锁的持有情况,哪些线程在等待锁,哪些现线程持有锁,都可以看到。
jstack -l pid
jstack -l 8608 > file 重定向到一个文件看
后续把这个文件加载到分析栈的工具看
栈包含的信息:
线程名称
编号
线程类型daemon守护线程
线程优先级prio数字越大线程优先级越高、
系统优先级os
tidjvm内存的线程唯一标识
nid本地线程id,这是16进程,usrcpu高,线程号转成16进制后在栈中找nid所对应的值,对应系统tid(重点关注)
本地线程状态 waiting for monitor(有且仅有一个monitor),等待一个锁。
runnable正处于运行状态、waiting on condition线程正在等待某一条件发生或线程正在等待资源。
waiting for monitor entry 或 in Object.wait() 重点要去关注这个,阻塞时就处于
线程占用的内存地址、JVM线程运行状态、状态对应