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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。