使用JDK自带的工具jstack找出造成运行程序死锁的原因
Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来。如何分析造成Java多线程的原因呢?很多时候我们在怀疑造成死锁的语句设置断点,单步调试,反而又不能重现了。这种现象很正常,因为咱们单步调试和直接运行程序,代码执行的时序是不同的,很可能无法满足死锁的触发条件。
实际上,JDK已经给Java程序员提供了强大的死锁分析工具,能够直接分析一个正在运行的并且处于死锁状态的应用,并给出具体是哪一行Java代码引起的死锁。
这篇文章就以一个例子来给大家演示如何使用这个JDK提供的标准工具。
这个工具叫jstack,就是JDK安装目录的bin文件夹下的一个执行文件。
我们首先写一个会导致死锁的应用出来。
public class DeadLockExample {public static void main(String[] args) {final String resource1 = "ABAP";final String resource2 = "Java";Thread t1 = new Thread() {public void run() {synchronized (resource1) {System.out.println("Thread 1: locked resource 1");try {Thread.sleep(100);}catch (Exception e) {}synchronized (resource2) {System.out.println("Thread 1: locked resource 2");}}}};Thread t2 = new Thread() {public void run() {synchronized (resource2) {System.out.println("Thread 2: locked resource 2");try {Thread.sleep(100);}catch (Exception e) {}synchronized (resource1) {System.out.println("Thread 2: locked resource 1");}}}};t1.start();t2.start();}
}
这个应用思路很简单,同时启动两个线程,分别锁住了resource1和resource2,然后休眠0.1秒,接着分别尝试去请求资源resource2和resource1。
执行应用,在控制台打印出下列输出后,进入死锁状态:
Thread 1: locked resource 1
Thread 2: locked resource 2
使用命令行 jps -l -m找到处于死锁状态应用的进程id。从下图得知死锁进程为51476:
然后使用命令行jstack 51476打印这个进程的运行栈信息。
我上图红色高亮出的 0x00000000d6f64988 和 0x00000000d6f649b8代表了代码中的两个资源“ABAP” 和“Java”。
jstack打印的输出非常清晰,显示了具体哪行Java代码试图去锁定哪一个Java资源(下图的waiting to lock)但是没有成功, 并且将失败的原因,即拥有当前请求资源的线程名称也打印了出来。
有了jstack,Java程序员不用对着冗长烧脑的多线程代码去冥思苦想了,JDK会自动把死锁原因打印出来,太方便了。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
使用JDK自带的工具jstack找出造成运行程序死锁的原因相关推荐
- 小工具:找出序列中的极值点
小工具:找出序列中的极值点 逐渐痴迷于A股投机.最近研究A股大盘择时,发现研究时间序列周期性的时候,找序列中的极大极小值是一个很重要的工作(在很多信号处理算法多都需要做这一步).很多Python库包都 ...
- 用Windows自带的工具写一个一键关机小程序
如何用Windows自带的工具写一个一键关机小程序 工具/原料(打勾勾的可用可不用) 装有Windows系统的电脑 在机子上装个格式工厂(版本随意,最好更新到最新的) 制作环境 windows自带命令 ...
- 在 Linux 上找出并解决程序错误的主要方法【转】
在 Linux 上找出并解决程序错误的主要方法[转] 参考文章: (1)在 Linux 上找出并解决程序错误的主要方法[转] (2)https://www.cnblogs.com/sky-heaven ...
- 计算机上找不到运行程序怎么办,电脑运行程序打不开怎么解决
电脑运行程序打不开怎么解决 导语:造成运行打不开的原因有用户设置出现了问题找不到运行程序,电脑被中毒.也有可能是硬件故障造成.这些都是有一定可能性.桌面运行程序打不开怎么解决?以下是小编收集的有关电脑 ...
- JDK自带JVM工具
1 jdk 自带工具之jstat--虚拟机进程状况工具 使用方式 Usage: jstat -help|-optionsjstat -<option> [-t] [-h<lines& ...
- 【原创】字符串工具类--找出单元字符串
package week01;import java.util.regex.Matcher; import java.util.regex.Pattern;/***** * 字符串帮助类* @auth ...
- 【JVM性能调优】使用jstack找出最耗CPU的java线程
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体的代码,所以它在JVM性能调优中很常见.下面我们在找出某个java进程中最耗CPU的线程,并定位堆栈信息,使用到的命令有:ps.top.p ...
- JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有 ...
- 使用工具快速找出custom work center使用的ui component
Created by Jerry Wang on Aug 03, 2014 已知UI上客户自己创建了一个work center "RTL test(使用business role TPM_P ...
最新文章
- 新浪微博封装类,以及常见问题sdk修改
- html应用多个类,html – 如何避免重复多个css类
- 响应格式html,设置响应格式的HTML邮件
- 使用 Maven 执行 java main class(java应用程序)
- 一篇文章教你学会使用SpringBoot实现文件上传和下载
- 博客主题正在修改....
- vlan划分不能上网_VLAN工作原理
- MySQL进阶(DDL与DML)
- react-native Android release打包失败
- 【02】查询优化的技术范围
- 使用PHPWord生成word文档
- Excel学习 -- 函数基础
- 工业相机与工业镜头相关参数详解
- 来看看小夏的链表讲解吧---从单链表到输入输出,查找元素,删除结点。---谨以此文祝朋友们生日快乐与官宣发糖。
- poi4.0升级踩坑合集(更新中)
- RedHat上安装openssl
- RangingTool 覆盖物文案国际化
- 计算机网络——网络层知识点
- JAVA高并发程序设计(葛一鸣著)读书笔记
- linux 找u盘,linux系统怎样找到U盘?
热门文章
- [ERROR] org.testng.TestNGException:Cannot find class in classpath:
- maven 配置(安装)以及遇到的The JAVA_HOME environment variable is not defined correctly.
- 数据分析面试必考的AB-Test知识点整理
- SAP Commerce Cloud SmartEdit 的安装
- SAP Spartacus Title 下拉菜单列表数据的读取逻辑
- 使用 SAP Business Application Studio 开发 Vue 应用
- 具有SmartFilterBar 的 SAP Fiori Elements 自动触发的搜索操作
- 试图安装客户出现SSR问题的Spartacus Storefront时遇到的错误消息
- 如何查找历史版本的SAP UI5 API文档
- SAP Authenticator apk下载