`
Vitas_Wang
  • 浏览: 9190 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JStack 介绍

    博客分类:
  • java
阅读更多
JStack用于产生虚拟机当前时刻的线程快照;
即所有线程当前的堆栈状态,通过分析当前堆栈的状态我们可以知道当前线程在等待什么资源,占有什么资源.
通过分析各个线程占有的资源和等待的资源发现死锁问题等等。
我这里写了一个饥饿版哲学家思考问题,来产生死锁问题,代码可在https://github.com/Jaler/JavaAnalystTools下面的DiningPhilosophersHungryVersion.java获取大家可以参考
我将jstack主要信息列出,如下:
daisydeMacBook-Air:~ daisy$ jps
1099 DiningPhilosophers
daisydeMacBook-Air:~ daisy$ jstack 1099

"Philosopher4" #13 prio=5 os_prio=31 tid=0x00007fa3ba81f800 nid=0x5403 waiting for monitor entry [0x000000011e1e3000]
java.lang.Thread.State: BLOCKED (on object monitor)
at jaler.deadlock.Philosopher.eat(Philosopher.java:22)

waiting to lock (a jaler.deadlock.Chopstick)
locked (a jaler.deadlock.Chopstick)
at jaler.deadlock.Philosopher.run(Philosopher.java:38)
at java.lang.Thread.run(Thread.java:745)

"Philosopher3" #12 prio=5 os_prio=31 tid=0x00007fa3bb02e800 nid=0x5203 waiting for monitor entry [0x000000011e0e0000]
java.lang.Thread.State: BLOCKED (on object monitor)
at jaler.deadlock.Philosopher.eat(Philosopher.java:22)

waiting to lock (a jaler.deadlock.Chopstick)
locked (a jaler.deadlock.Chopstick)
at jaler.deadlock.Philosopher.run(Philosopher.java:38)
at java.lang.Thread.run(Thread.java:745)

"Philosopher2" #11 prio=5 os_prio=31 tid=0x00007fa3bb034000 nid=0x5003 waiting for monitor entry [0x000000011dfdd000]
java.lang.Thread.State: BLOCKED (on object monitor)
at jaler.deadlock.Philosopher.eat(Philosopher.java:22)

waiting to lock (a jaler.deadlock.Chopstick)
locked (a jaler.deadlock.Chopstick)
at jaler.deadlock.Philosopher.run(Philosopher.java:38)
at java.lang.Thread.run(Thread.java:745)

"Philosopher1" #10 prio=5 os_prio=31 tid=0x00007fa3bb8b9000 nid=0x4e03 waiting for monitor entry [0x000000011deda000]
java.lang.Thread.State: BLOCKED (on object monitor)
at jaler.deadlock.Philosopher.eat(Philosopher.java:22)

waiting to lock (a jaler.deadlock.Chopstick)
locked (a jaler.deadlock.Chopstick)
at jaler.deadlock.Philosopher.run(Philosopher.java:38)
at java.lang.Thread.run(Thread.java:745)
"Philosopher0" #9 prio=5 os_prio=31 tid=0x00007fa3ba81f000 nid=0x4c03 waiting for monitor entry [0x000000011ddd7000]
java.lang.Thread.State: BLOCKED (on object monitor)
at jaler.deadlock.Philosopher.eat(Philosopher.java:22)

waiting to lock (a jaler.deadlock.Chopstick)
locked (a jaler.deadlock.Chopstick)
at jaler.deadlock.Philosopher.run(Philosopher.java:38)
at java.lang.Thread.run(Thread.java:745)
我们就近分析Philosopher0线程,它当前状态State is BLOCKED, lock了0x00000007aabee7d8, 等待lock 0x00000007aabee7e8. 而0x00000007aabee7e8 被线程 Philosopher1 lock了,但线程Philosopher1 在等待获取0x00000007aabee7f8...最终结果就是每个哲学家持有一个锁不放手,而且在等待另外一个锁。最终谁都吃不上。

我们现在已经大概能看懂jstack信息了,并且知道它一般用来分析死锁问题,接下来我们对这个命令进行一些详细的介绍: daisydeMacBook-Air:~ daisy$ jstack -help Usage:

jstack [-l] (to connect to running process)
jstack -F [-m] [-l] (to connect to a hung process)
jstack [-m] [-l] (to connect to a core file)
jstack [-m] [-l] [server_id@] (to connect to a remote debug server)
Options:

-F to force a thread dump. Use when jstack does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message 帮助说的很清楚, jstack可以跟4个参数:
-F 当jstack无法输出时,加上-F可以强制输出
-m 除了打印java堆栈信息外,还输出native方法的堆栈信息;当需要分析native调用时可以使用
-l 打印更多锁的信息
-h help文档
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics