如果程序挂死,有时使用jstack查看进程中线程信息时,需要添加上-F参数,此时如果有死锁信息,则可能不会打印出死锁堆栈信息,使用jdb则可以查看当前死锁线程的运行堆栈。

如下模拟一个简单的死锁程序

package com.demo.bootdemo;

import java.util.HashMap;
import java.util.Map; import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component; @Component
public class MyListeners implements ApplicationListener<ContextRefreshedEvent> { private Map map = new HashMap<>();
private String lock = "aa"; @Override
public void onApplicationEvent(ContextRefreshedEvent arg0) { Thread t = new Thread(new Runnable() { @Override
public void run() {
synchronized (map) {
System.out.println(Thread.currentThread().getName() + ": 获得map锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + ": 获得lock锁");
}
}
}
}, "t-1"); Thread t2 = new Thread(new Runnable() { @Override
public void run() {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + ": 获得lock锁");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (map) {
System.out.println(Thread.currentThread().getName() + ": 获得map锁");
}
}
}
}, "t-2"); t.start();
t2.start();
} }

获取pid

假设当前不能直接连接27709虚拟机,需要使用参数-F

可以看出造成死锁的线程未t-1和t-2

使用jdb连接jvm

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=27709

执行threads命令获取所有线程列表

获取线程“t-1”堆栈信息,如下图,结合上述模拟死锁的代码,很容易就能看出来是哪里的问题

类似的,获取线程“t-2”的堆栈信息

通过以上步骤,基本上可以确定问题代码了。

本例也是匆忙中简单查看了下文档,没有详看,后续有时间在进行补充,jdb文档如下

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr011.html#BABDHAHJ

最新文章

  1. JavaScript indexOf() 方法 和 lastIndexOf() 方法
  2. /usr/include/features.h:367:25:fatal errorXXXXXX类似这种问题
  3. mysql中的游标使用案例
  4. [转]在ASP.NET开发中容易忽略的2个小问题 Cookie乱码存取异常 和 iframe弹框的login跳转
  5. Helloworld程序的创建以及配置文件的讲解
  6. nandflash操作详解
  7. 无法找到AdbWinApi.dll问题解决 .
  8. 用Objective-C的foundation框架解决表达式求值问题
  9. 2013 长沙网络赛 B 题 Bizarre Routine
  10. 机器设备(dfs)
  11. iOS 创建上线证书
  12. MVC — 初步理解IIS工作流程
  13. [js高手之路]面向对象+设计模式+继承一步步改造简单的四则运算
  14. 听说你开发.NET还在用VS,小哥哥给你推荐全平台的Rider
  15. gulp填坑记(一)
  16. [再寄小读者之数学篇](2014-06-26 Besov space estimates)
  17. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
  18. python 从基础到入门链接
  19. python 闯关之路二(模块的应用)
  20. 手工搭建web项目

热门文章

  1. Nginx 无法重启
  2. odoo 权限文件说明
  3. 【异常】postman能够请求成功获取到参数,前端请求的却请求不到
  4. MySQL连表查询练习题
  5. Go语言基础之操作MySQL
  6. Tomcat 7 简单定制
  7. js去掉url后某参数【函数封装】
  8. QTP(5)
  9. zencart清空产品商品实用命令
  10. POJ 1741 单次询问树上距离&lt;=K的点对数 点分治