jstack和线程dump实例解析
jstack定义:
jstack是Java虚拟机自带的一种堆栈跟踪工具。
基本介绍:
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
命令格式:
jstack[option]pid
基本参数:
-F当'jstack[-l]pid'没有相应的时候强制打印栈信息
-l长列表.打印关于锁的附加信息,例如属于java.util.concurrent的ownablesynchronizers列表.
-m打印java和nativec/c++框架的所有栈信息.-h|-help打印帮助信息
pid需要被打印配置信息的java进程id,可以用jps工具查询
案例
C:\Users\Administrator>jstack5516 FullthreaddumpJavaHotSpot(TM)64-BitServerVM(24.79-b02mixedmode): "DestroyJavaVM"prio=6tid=0x000000000027d800nid=0x1bb0waitingoncondition[0 x0000000000000000] java.lang.Thread.State:RUNNABLE "Thread-1"prio=6tid=0x000000000cb13800nid=0x19acwaitingformonitorentry[0 x000000000d67f000] java.lang.Thread.State:BLOCKED(onobjectmonitor) atthread.DeadLockDemo$2.run(DeadLockDemo.java:35) -waitingtolock<0x00000007d5a9be88>(ajava.lang.String) -locked<0x00000007d5a9beb8>(ajava.lang.String) atjava.lang.Thread.run(UnknownSource) "Thread-0"prio=6tid=0x000000000cb0e800nid=0x6bcwaitingformonitorentry[0x 000000000d48f000] java.lang.Thread.State:BLOCKED(onobjectmonitor) atthread.DeadLockDemo$1.run(DeadLockDemo.java:21) -waitingtolock<0x00000007d5a9beb8>(ajava.lang.String) -locked<0x00000007d5a9be88>(ajava.lang.String) atjava.lang.Thread.run(UnknownSource)
这里运行了一段死锁code,导致程序中的两个线程都在等待对方释放锁,造成程序死锁。
从这段代码中可以明确的看出是DeadLockDemo.class中的第35行,和21行出现了阻塞,然后就是要优化这个函数了。
PS:在实际运行中,往往一次dump的信息,还不足以确认问题。建议产生三次dump信息,如果每次dump都指向同一个问题,我们才确定问题的典型性。
总结
以上就是本文关于jstack和线程dump实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!