jstack+jdb命令查看线程及死锁堆栈信息
如果程序挂死,有时使用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
jstack+jdb命令查看线程及死锁堆栈信息的更多相关文章
- top命令查看线程信息和jstack使用介绍
top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid jstack 线程ID 可以查看某个线程的堆栈情况,特别对于hung挂死的线程,可以使用选项-F强制打印dump信 ...
- centos who命令 查看当前登录系统用户信息
who 显示当前登录系统的用户,但w显示的更为详细 默认输出 [root@mysql ~]# who //用户名.登录终端.登录时间 root pts/ -- : (192.168.0.110) -a ...
- java查看线程的堆栈信息
通过使用jps 命令获取需要监控的进程的pid,然后使用jstack pid 命令查看线程的堆栈信息. 通过jstack 命令可以获取当前进程的所有线程信息. 每个线程堆中信息中,都可以查看到线程ID ...
- java命令--jstack 工具 查看JVM堆栈信息
介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...
- java命令分析线程死锁以及内存泄漏
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项&qu ...
- Linux使用jstat命令查看jvm的GC情况(转)
B. jstack jstack主要用来查看某个Java进程内的线程堆栈信息.语法格式如下: 1 jstack [option] pid 2 jstack [option] executable co ...
- kill -3 PID命令获取java应用堆栈信息
一.应用场景: 当linux服务器出现异常情况(响应缓慢,负载持续飙升)并且服务器没有安装对应的包而无法使用jstack等命令时,可以使用linux的kill相关命令打印堆栈信息. 命令格式:kill ...
- java 查看线程的信息
的代码上加上 断点 运行 进入Terminal jps 查看进程号 jstack 进程号 查看线程的信息 jstack pid 此时进去DEBUG 端F9 跑完程序 再回到Terminal 中 就能 ...
- 线程---JDK查看线程
JDK和LINUX提供的查看当前运行的线程的工具: KILLkill -3 [pid]:线程相关信息会列在Console上JSTACKjstack [pid]:查看线程运行状况,如等锁,运行等JCON ...
随机推荐
- django概念理解
STATIC_URL 和 STATICFILES_DIRS 区别 static_url指定浏览器上访问静态文件的url前缀,也就是'/static/'前缀的都会认为是静态文件,django不解析,直 ...
- 解决 'mvn' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
'mvn' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 九步完成
- 第十一章、特性property
目录 第十一章.特性property 一.property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 二.为什么要用property 三.封装与拓展性 第十一章.特性property ...
- 如何解决Win10电脑网速慢的问题?
很多Win10系统用户反映自己的电脑配置并不算低,却比有些旧电脑上网速度还要慢,不知道是什么原因. 其实,除了运营商网速的原因外,我们的电脑设置也会对网速有所影响.下面好系统U盘启动就来介绍一个Win ...
- Go语言基础之操作Redis
Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言如何操作Redis. Redis介绍 Redis是一个开源的内存数据库,Redis提供了5种不同类型的数据结构,很多业 ...
- 数据结构---->数组
1.什么是数组? 数组是一种线性的数据结构.它同一组连续的内存空间,来存储一组具有相同类型的数据. 简单说明几点: (1).线性表:就是数据排成像一条线一样的结构.每个线性表的数据最多只有前和后两个方 ...
- Ubuntu .tar.xz文件解压缩命令
1.解压缩.tar.xz文件 这是两层压缩,外面是xz压缩方式,里层是tar压缩 所以可以分两步实现解压 $ xz -d filename.tar.xz $ tar -xvf filename.tar ...
- 接口数据转json格式
接口数据转json格式 function tojson($result, $callback = null){ header('Content-Type:text/html; charset=utf- ...
- httpwatch
https://blog.csdn.net/coderising/article/details/89530016 别人的文章
- iOS 环形进度条
.h文件 #import <UIKit/UIKit.h> @interface YTProgressView : UIView@property (nonatomic, copy) NSS ...