jstack命令详解windows,jstack用法

  jstack命令详解windows,jstack用法

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  推荐: 《java教程》

  Java jstack 命令详解

  爪哇中jstack命令可以用来查看运行的爪哇进程下,多线程的运行情况,我们用一个死锁的例子来看:

  比如下面这段死锁的代码:

  公共类死锁{

  私有静态对象objA=new Object();

  私有静态对象objB=new Object();

  公共静态void main(String[] args) {

  线程thread1=新线程(新线程1());

  螺纹thread2=新线程(新线程2());

  线程1。start();

  线程2。start();

  }

  私有静态类线程1实现可运行{

  @覆盖

  公共无效运行(){

  同步(objA) {

  System.out.println(线程一得到A对象的锁);

  尝试{

  线程。睡眠(3000);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  同步(objB) {

  System.out.println(线程一得到B对象的锁);

  }

  }

  }

  }

  私有静态类线程2实现可运行{

  @覆盖

  公共无效运行(){

  同步(objB) {

  System.out.println(线程2得到B对象的锁);

  尝试{

  线程。睡眠(3000);

  } catch (InterruptedException e) {

  e。printstacktrace();

  }

  同步(objA) {

  System.out.println(线程2得到A对象的锁);

  }

  }

  }

  }

  }当然,运行结果只能看到两个线程只拿到了一个锁,在一直等待对方的锁。

  线程一得到A对象的锁

  线程2得到B对象的锁我们可以使用日本药理学会来查看对应的PID,然后使用jstack来查看其线程情况:

  [root@admin ~]# jps

  42576 Jps

  43616死锁[root@admin ~]# jstack 43616

  全线程转储Java热点(TM) 64位服务器虚拟机(24.45-b08混合模式):

  DestroyJavaVM prio=6 tid=0x 00000000047 c1000 NID=0x 9878等待条件[0x 00000000000000]

  状态:可运行

  “线程-1”优先级=6 tid=0x 0000000010 aa 3000 NID=0x AFA 0等待监视器条目[0x 000000001105 f000]

  java.lang.Thread.State:阻塞(在对象监视器上)

  在com。在边梅。测试$thread 2。运行(测试。Java:46)

  -等待锁定0x 000000007 c 099 cc 20(Java。郎。对象)

  -锁定0x 00000007 c 099 cc 30(Java。郎。对象)

  位于Java。郎。线程。运行(线程。Java:744)

  thread-0 prio=6 tid=0x 0000000010 aa 2800 NID=0xa e74等待监视器条目[0x 0000000010 f5f 000]

  java.lang.Thread.State:阻塞(在对象监视器上)

  在com。在边梅。测试$thread 1。运行(测试。Java:27)

  -等待锁定0x 000000007 c 099 cc 30(Java。郎。对象)

  -锁定0x 00000007 c 099 cc 20(Java。郎。对象)

  位于Java。郎。线程。运行(线程。Java:744)

  "服务线程"守护程序prio=6 tid=0x 0000000000 F10 a000 NID=0x 9 A8 c runnable[0x 00000000000]

  状态:可运行

  C2编译器线程1 守护程序prio=10 tid=0x 000000000 f 109800 NID=0x af 28等待条件[0x 000000000000000]

  状态:可运行

  C2编译器线程0 守护程序prio=10 tid=0x 000000000 f 105800 NID=0x 85 DC等待条件[0x 000000000000000]

  状态:可运行

  "附加侦听器"守护程序prio=10 tid=0x 000000000 f 104800 NID=0x AC 04等待条件[0x 00000000000000]

  状态:可运行

  信号调度程序守护进程prio=10 tid=0x 0000000000 f 102000 NID=0xa 678 runnable[0x 000000000000]

  状态:可运行

  Object.wait()中的"终结器"守护程序prio=8 tid=0x 000000000 f0bd 000 NID=0x aed 8[0x 00000001045 f000]

  java.lang.Thread.State:等待(在对象监视器上)

  在java.lang.Object.wait(本地方法)

  -等待0x00000007c0905568(一个Java。郎。参考文献。参考队列$锁)

  在爪哇。郎。参考文献。参考队列。移除(引用队列。Java:135)

  -锁定0x00000007c0905568(一个Java。郎。参考文献。参考队列$锁)

  在爪哇。郎。参考文献。参考队列。移除(引用队列。Java:151)

  在爪哇。郎。参考文献。终结器$终结器线程。运行(终结器。Java:189)

  Object.wait()中的"引用处理程序" daemon prio=10 tid=0x 000000000 f0b 2000 NID=0x aedc[0x 00000001035 f000]

  java.lang.Thread.State:等待(在对象监视器上)

  在java.lang.Object.wait(本地方法)

  -等待0x 000000007 c 09050 f 0(一个Java。郎。参考文献。参考美元锁)

  在爪哇。郎。对象。等等(反对。Java:503)

  在爪哇。郎。参考文献。reference $引用处理程序。运行(参考。Java:133)

  -锁定0x 000000007 c 09050 f 0(一个Java。郎。参考文献。参考美元锁)

  虚拟机线程prio=10 tid=0x 000000000 f0b 0000 NID=0x AEF 0可运行

  乔治勋章任务线程# 0(并行GC) prio=6 tid=0x 00000000047d 6000 NID=0x ACB 0可运行

  乔治勋章任务线程# 1(并行GC) prio=6 tid=0x 00000000047d 8000 NID=0x aee 0 runnable

  乔治勋章任务线程# 2(并行GC) prio=6 tid=0x 00000000047d 9800 NID=0x aed 4 runnable

  乔治勋章任务线程# 3(并行GC) prio=6 tid=0x 00000000047 db 000 NID=0x AC 54 runnable

  伏特计周期性任务线程prio=10 tid=0x 000000000 f 132000 NID=0x aff 0等待条件

  调用全球参考:105

  发现一个爪哇级死锁:

  =============================

  "线程-1":

  等待锁定监视器0x 000000000 f0ba 488(对象0x 00000007 c 099 cc 20,一个java.lang.Object),

  其由"线程-0"持有

  "线程-0":

  等待锁定监视器0x 000000000 f 0 BCF 28(对象0x 00000007 c 099 cc 30,一个java.lang.Object),

  其由"线程1"持有

  上面列出的线程的爪哇堆栈信息:

  ===================================================

  "线程-1":

  在com。在边梅。测试$thread 2。运行(测试。Java:46)

  -等待锁定0x 000000007 c 099 cc 20(Java。郎。对象)

  -锁定0x 00000007 c 099 cc 30(Java。郎。对象)

  位于Java。郎。线程。运行(线程。Java:744)

  "线程-0":

  在com。在边梅。测试$thread 1。运行(测试。Java:27)

  -等待锁定0x 000000007 c 099 cc 30(Java。郎。对象)

  -锁定0x 00000007 c 099 cc 20(Java。郎。对象)

  位于Java。郎。线程。运行(线程。Java:744)

  发现一个死锁。我们可以看到jstack打印出了线程的状态,而且发现一个死锁。

  另外,线程状态有以下几种:

  -可运行线程运行中或输入-输出等待

  -被阻止线程在等待班长锁(同步关键字)

  -定时等待线程在等待唤醒,但设置了时限

  -等待线程在无限等待唤醒以上就是jstack命令详解的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: