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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样使用jstack诊断Java应用程序故障相关的知识,希望对你有一定的参考价值。

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

1.DeadLock类是一个死锁的例子代码如下:

以上DeadLock类是一个死锁的例子,假使在不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。

2.可以使用jps查看该程序的jpid值和使用jstack来生产堆栈结果问题:

3.结果文件deadlock.jstack内容如下: 

总结:从这个结果文件一看到发现了一个死锁,具体是线程t2在等待线程t1,而线程t1在等待线程t2造成的,同时也记录了线程的堆栈和代码行数,通过这个堆栈和行数我们就可以去检查对应的代码块,从而发现问题和解决问题。

参考技术A  intellij idea默认文件是自动保存的,但是手头有个项目jsp文件改动后,在tomcat中不能立即响应变化。要jsp文件改动后立刻看到变化,有个配置。
  在idea tomcat 中server的配置里,有个on frame deactivation,选择update classes and resources。另外有个配置on update action,就是手动操作的时候采取什么动作,可以重启服务器,也可以像上面一样更新类和资源文件,我选的是Redeploy。 可是当前项目没有update classes and resources这个选项,有个Hot Swap classes。
  这是由于服务器添加的Artifact类型问题,一般一个module对应两种类型的Artifact,一种是war,一种是war explored。
  war就是已war包形式发布,当前项目是这种形式,在这种形式下on frame deactivation配置没有update classes and resources选项。war explored是发布文件目录,选择这种形式,on frame deactivation中就出现update classes and resources选项了。
/**
* 死锁例子
* @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();


本回答被提问者采纳
参考技术B 如:
jstack [-l] pid
提供一个测试的例子:
/**
* 死锁例子
* @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();


保存为DeadLock.java。以上DeadLock类是一个死锁的例子,假使在我们不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候我们就可以使用ps –ef|grep xxx查看该程序的pid值和使用jstack来生产堆栈结果问题。
javac DeadLock.java
jar cvf deadlock.jar DeadLock*.class
java -cp deadlock.jar DeadLock &
ps –ef|grep deadlock.jar #获取deadlock.jar进程的pid为1448
jstack -l 1448 > deadlock.jstack
结果文件deadlock.jstack内容就会被打印出来,这样就可以根据打印出的结果进行判断了

以上是关于怎样使用jstack诊断Java应用程序故障的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

JVM故障问题排查心得「线程诊断系列」通过jstack线程状态分析虚拟机线程问题指南

基于Linux的WebSphere性能调优与故障诊断