1:查看进程id:
2:切换到java bin目录执行 jstack -l pid
测试代码,一个死锁程序。
3:jstack日志下载,使用工具分析:jstack -l pid << my.txt
先建好my.txt文件。
4:使用工具打开my.txt文件解析查看:
5:查看死锁原因:
6:对照代码分析:
package com.jstack;
public class NativeOptimize {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj2) {
System.out.println(Thread.currentThread().getName() + "锁住 obj2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
// 执行不到这里
System.out.println("1秒钟后," + Thread.currentThread().getName()
+ "锁住 obj1");
}
}
}
}).start();
synchronized (obj1) {
System.out.println(Thread.currentThread().getName() + "锁住 obj1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
// 执行不到这里
System.out.println("1秒钟后," + Thread.currentThread().getName()
+ "锁住 obj2");
}
}
}
}
7:IBM其他字段解析: 1.死锁,Deadlock(重点关注) 2.执行中,Runnable(重点关注) 3.等待资源,Waiting on condition(重点关注) 4.等待监控器检查资源,Waiting on monitor 5.暂停,Suspended 6.对象等待中,Object.wait() 7.阻塞,Blocked(重点关注) 8.停止,Parked Deadlock:死锁线程:一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。 Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据 库执行,有可能在对某个文件操作,有可能进行数据类型等转换。 Waiting on condition:等待资源,如果堆栈信息明确是应用代码,则证明该线程正在等待资源,一般是大 量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取。又或者, 正在等待其他线程的执行等。 Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管
eg:
显示有两处Blocked,查找具体信息:
显示此类中47行阻塞,
查找代码,此处为sleep操作。
图上代码具体逻辑可参考公众号:《咋货铺》
文章:2021第一行代优化
别的信息,下次继续讲解分析
不足之处,欢迎各位一起指导。