我们经常会遇到java程序遇死锁的问题,也会经常遇到。
案例
以下是案例代码:
package com.dzend.mall.order;public class JstackLockDemo {public static final int initData =666;public static User user = new User();public int compute(){int a=1;int b=2;int c=(a+b)*10;return c;}public static void main(String[] args) {JstackLockDemo jstackLockDemo = new JstackLockDemo();while(true) {jstackLockDemo.compute();}}
}
class User{private int id;private String username;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}
一、运行这个程序JstackLockDemo
二、用jps找出当前的pid
pid为1836
三、启动Process Explorer
1、下载地址:
进程资源管理器 - Sysinternals | Microsoft Learn了解哪些文件、注册表项和其他对象进程已打开,它们已加载了哪些 DLL 等。https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
2、下载完,启动程序
3、找到pid为1836的进程,右键properties
4、查找到cpu资源使用高的的线程,线程ID:23396
四、用jstack工具收集该进程日志
1、在命令行输入
jstack 1836 > d://1836.out
2、到d盘去查看,已经保存了1836.out
3、用记事本打开查看详细信息
把23396转化成16进制的5b64,用查找5b64
就能看到第19行的代码有问题,再进一步分析