JVM(HotSpot):虚拟机栈(JVM Stacks)之线程问题排查方法

文章目录

前言

本篇讲的排查都是基于Linux环境的。

一、CPU占用过大

这个一般是出现了死循环导致的。

1、先用top命令查看占用CPU的进程ID

bash 复制代码
top

2、再用ps命令查看对应的线程

就看一查看到对应的线程id

bash 复制代码
ps H -eo pid,tid,%cpu |grep 1678

3、jstack查看具体线程
jstack可以查看进程内所有的线程信息

bash 复制代码
jstack pid

可以看到一个线程名为main的线程,类名也就是我们用户写的类名,不是JDK的类名。

注意,我们用ps命令查看的进程ID和线程ID都是10进制的。

jstack显示的线程ID16进制的,所以,要转换一下。

1679对应的是68F,这样,对应jstack的nid

从而定位到具体的线程报错。在Demo1.java第三行。

从这里,我们也可以总结出,在平时开发中,我们创建线程,一定要给线程命名。方便排查问题。

4、案例源码

java 复制代码
public class Demo1 {
	public static void main(String[] args) {
		while (true){}
	}
}

二、程序运行很长时间没有结果

这个一般是出现线程死锁。

1、先用top或者ps定位程序的进程ID

我这里是案例演示,所以,用top查看Java进程ID,因为,我的机器上只运行了一个Java程序。

2、用jstack查看线程信息

bash 复制代码
jstack pid

此时,我们定位到具体Java代码位置,然后,去分析,为什么产生死锁,针对性优化即可。

3、案例源码

java 复制代码
public class Demo2 {
	static byte[] a = new byte[1];
	static byte[] b = new byte[1];

	public static void main(String[] args) throws InterruptedException {
		Thread thread01 = new Thread(() -> {
			synchronized (a) {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (b) {
					System.out.println("我获得了a和b!");
				}
			}
		});
		thread01.setName("Thread01");
		thread01.start();
		Thread.sleep(1000);
		Thread thread02 = new Thread(() -> {
			synchronized (b) {
				synchronized (a) {
					System.out.println("我获得了a和b!");
				}
			}
		});
		thread02.setName("thread02");
		thread02.start();
	}
}

三、总结

先用top或者ps命令,找到Java进程ID,然后,用jstack工具定位到具体线程。
Java的线程问题,最终还是用jstack工具去排查。

其实,查看Java进程,还可以用jps命令

所以,建议jps+jstack来排查Java线程问题。

相关推荐
码兄科技2 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研3 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe183 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_3 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff4 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯5 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地5 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123455 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦1686 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
微信开发api-视频号协议6 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad