问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎样使用jstack诊断Java应用程序故障

发布网友 发布时间:2022-04-25 15:31

我来回答

2个回答

懂视网 时间:2023-01-27 09:45

jstack的作用是将正在运行的jvm的线程情况进行快照,并且打印出来。

  

  jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的,不同的 JVM版本, dump信息也有差别。在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。

热心网友 时间:2023-01-27 06:53

1. 首先来了解一下jstack这个命令的作用,jstack 是一个可以返回在应用程序上运行的各种各样线程的一个完整转储的实用程序,您可以使用它查明问题。jstack [-l] <pid>,jpid可以通过使用jps命令来查看当前Java程序的jpid值,-l是可选参数,它可以显示线程阻塞/死锁情况。

/**
* 死锁例子
* @author crane.ding
* @since 2011-3-20
*/
public class DeadLock {

public static void main(String[] args) {
final Object obj_1 = new Object(), obj_2 = new Object();

Thread t1 = new Thread("t1"){
@Override
public void run() {
synchronized (obj_1) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}

synchronized (obj_2) {
System.out.println("thread t1 done.");
}
}
}
};

Thread t2 = new Thread("t2"){
@Override
public void run() {
synchronized (obj_2) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}

synchronized (obj_1) {
System.out.println("thread t2 done.");
}
}
}
};

t1.start();
t2.start();
}

}

2. 以上DeadLock类是一个死锁的例子,假使在不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候就可以使用jps查看该程序的jpid值和使用jstack来生产堆栈结果问题。
$ java -cp deadlock.jar DeadLock &
$

$ jps
3076 Jps
448 DeadLock
$ jstack -l 448 > deadlock.jstack
结果文件deadlock.jstack内容如下:
2011-03-20 23:05:20
Full thread mp Java HotSpot(TM) Client VM (19.1-b02 mixed mode, sharing):

"DestroyJavaVM" prio=6 tid=0x00316800 nid=0x9fc waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"t2" prio=6 tid=0x02bcf000 nid=0xc70 waiting for monitor entry [0x02f6f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock <0x22a297a8> (a java.lang.Object)
- locked <0x22a297b0> (a java.lang.Object)

Locked ownable synchronizers:
- None

"t1" prio=6 tid=0x02bce400 nid=0xba0 waiting for monitor entry [0x02f1f000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock <0x22a297b0> (a java.lang.Object)
- locked <0x22a297a8> (a java.lang.Object)

Locked ownable synchronizers:
- None

"Low Memory Detector" daemon prio=6 tid=0x02bb9400 nid=0xa6c runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"CompilerThread0" daemon prio=10 tid=0x02bb2800 nid=0xcb8 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Attach Listener" daemon prio=10 tid=0x02bb1000 nid=0x7f4 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Signal Dispatcher" daemon prio=10 tid=0x02bd2800 nid=0xd80 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

"Finalizer" daemon prio=8 tid=0x02bab000 nid=0xe1c in Object.wait() [0x02d3f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0x229e1148> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

Locked ownable synchronizers:
- None

"Reference Handler" daemon prio=10 tid=0x02ba6800 nid=0xbe0 in Object.wait() [0x02cef000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x229e1048> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x229e1048> (a java.lang.ref.Reference$Lock)

Locked ownable synchronizers:
- None

"VM Thread" prio=10 tid=0x02b6a400 nid=0x568 runnable

"VM Periodic Task Thread" prio=10 tid=0x02bc8400 nid=0x75c waiting on condition

JNI global references: 878

Found one Java-level deadlock:
=============================
"t2":
waiting to lock monitor 0x02baaeec (object 0x22a297a8, a java.lang.Object),
which is held by "t1"
"t1":
waiting to lock monitor 0x02baa2bc (object 0x22a297b0, a java.lang.Object),
which is held by "t2"

Java stack information for the threads listed above:
===================================================
"t2":
at com.demo.DeadLock$2.run(DeadLock.java:40)
- waiting to lock <0x22a297a8> (a java.lang.Object)
- locked <0x22a297b0> (a java.lang.Object)
"t1":
at com.demo.DeadLock$1.run(DeadLock.java:25)
- waiting to lock <0x22a297b0> (a java.lang.Object)
- locked <0x22a297a8> (a java.lang.Object)

Found 1 deadlock.

3.从这个结果文件看到发现了一个死锁,具体是线程t2在等待线程t1,而线程t1在等待线程t2造成的,同时也记录了线程的堆栈和代码行数,通过这个堆栈和行数就可以去检查对应的代码块,从而发现问题和解决问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求这图片原图或者主角 出自哪一边电影或者电视剧 哪位大神知道这张图原版在吗?求原版。。。 在word中加下划线时第一次出现一条下划线第二次怎么就出现两条... 诛仙2资料站里的宠物展示能在npc买到吗 求一些诛仙2中的可以变为人形的宠物名字 诛仙2 神域的神农殿里,这是什么东西 诛仙2宠物元神问题 诛仙2 商城 中 宠物元神 怎么比 宠物 还贵啊?宠物元神是干什么的啊... 电热水器怎么安固定花洒 猛鬼夜惊魂剧情介绍 牛年运势 属兔人的财运,今年运势及命理如何? QQ空间相册里的照片有次给盗号的删了怎么样才能恢复? 2011年属兔人2021年运势及命运 11岁生肖兔在牛年每月运程如何 QQ相册被盗号的人删掉了,怎么才能找回? qq空间相册照片被删了还可以找回来吗? QQ空间被人恶意删除的相片能找回来吗? 我的qq昨晚被盗,qq相册相片被删除完了,还能恢复吗? 跪求!QQ空间相册被人删完了怎么办?怎么找回啊?在哪申诉啊? QQ被盗,相册被删了,能恢复吗? QQ空间相册被人删除了有没有办法恢复? 我QQ空间的相册被别人删了还能弄回来吗? 空间相册被人恶意删除,请问怎么找回? QQ空间里的相册被删除了,还可以恢复吗? 电饭煲可以直接保温吗 电饭锅保温10个小时可以吗 电饭煲断电保温四个小时可以吗? 电饭煲长时间处在保温状态会有什么不利吗求大神帮助 电饭锅保温一晚上,可以吗? 电饭锅煮好饭饭可不可以一直保温 金三银四如何找工作? jvm的启动参数都有哪些,分别表示什么.常用的问题诊断命令,jinfo,jmap,jstackj 为什么会&quot;well-known file is not secure java开发自身哪个中文版软件最好? 使用jmap dump出来的java堆镜像文件,可以用什么打开做详细分析 怎么给JVM加启动参数? UNIX 系统,一个进程hang住,想知道该进程的栈信息,用kill -3 pid,jstack pid Java开发如何准确的定位到占用内存或CPU最高的一行代码 昆医大二本哪个专业可以考教师? 在读大学生大几可以考教师资格证? 金牛座爱你会怎么表现出来? 金牛座男朋友越来越爱你的表现是什么? 金牛座男人爱你会怎么表现出来? 大二下学期可以考教师资格证吗? 金牛座男人爱你的表现 开一家凉皮肉夹馍小吃店需要买些什么设备? 现在大街上有许多流动小吃车看的挺赚钱的,我也想做个肉夹馍流动小吃车,哪有教技术的。 肉夹馍小吃车什么颜色的字显眼 金牛男爱你的床上表现 有没有肉夹馍的小吃车