java中在linux下利用jstack检测死锁

简介: 首先,编写一个死锁程序 1 package deadlock; 2 3 public class testJstack { 4 final static Object resource_1 = new Object(); 5 final static Obj...

首先,编写一个死锁程序

 1 package deadlock;
 2 
 3 public class testJstack {
 4     final static Object resource_1 = new Object();
 5     final static Object resource_2 = new Object();
 6 
 7     public static void main(String[] args) {
 8         Thread t1 = new Thread("t1") {
 9             public void run() {
10                 synchronized (resource_1) {
11                     try {
12                         Thread.sleep(3000);
13                     } catch (InterruptedException e) {
14                     }
15                     System.out.println("locked resource_1");
16                     synchronized (resource_2) {
17                         System.out.println("thread t1 done.");
18                     }
19                 }
20             }
21         };
22 
23         Thread t2 = new Thread("t2") {
24             public void run() {
25                 synchronized (resource_2) {
26                     System.out.println("locked resource_2");
27                     synchronized (resource_1) {
28                         System.out.println("thread t2 done.");
29                     }
30                 }
31             }
32         };
33         t1.start();
34         t2.start();
35     }
36 }

程序运行结果是:

lock resource_2
lock resource_1

接下来在终端中输入jsp查看当前运行的java程序:

7480 testJstack
13420 Jps

获取testJstack的进程ID为7480.然后使用命令:

jstack -l 7480 >deadlock.jstack

将jstack检测结果放入文件deadlock.jstack。使用vim查看该文件:

java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

   java.lang.Thread.State: RUNNABLE


   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)


   java.lang.Thread.State: BLOCKED (on object monitor)
        at testJstack$1.run(testJstack.java:15)

   Locked ownable synchronizers:
        - None

   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
   java.lang.Thread.State: RUNNABLE
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - locked <0x8c050b30> (a java.lang.ref.ReferenceQueue$Lock)

   Locked ownable synchronizers:
        - None

        - waiting on <0x8c050a30> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        - locked <0x8c050a30> (a java.lang.ref.Reference$Lock)

   Locked ownable synchronizers:
"VM Thread" prio=10 tid=0x0807e800 nid=0x260c runnable


JNI global references: 576


Found one Java-level deadlock:
=============================
"t2":
  which is held by "t1"
"t1":
  which is held by "t2"

Java stack information for the threads listed above:
===================================================
"t2":
        at testJstack$2.run(testJstack.java:29)
        - waiting to lock <0x8c087670> (a java.lang.Object)
        - locked <0x8c087678> (a java.lang.Object)
"t1":
        at testJstack$1.run(testJstack.java:15)
        - waiting to lock <0x8c087678> (a java.lang.Object)
        - locked <0x8c087670> (a java.lang.Object)

Found 1 deadlock.

 

目录
相关文章
|
23天前
|
安全 Java 开发者
Java并发迷宫:同步的魔法与死锁的诅咒
在Java并发编程中,合理使用同步机制可以确保线程安全,避免数据不一致的问题。然而,必须警惕死锁的出现,采取适当的预防措施。通过理解同步的原理和死锁的成因,并应用有效的设计和编码实践,可以构建出高效、健壮的多线程应用程序。
44 21
|
4月前
|
分布式计算 Java Hadoop
linux中HADOOP_HOME和JAVA_HOME删除后依然指向旧目录
通过以上步骤,可以有效地解决 `HADOOP_HOME`和 `JAVA_HOME`删除后依然指向旧目录的问题。确保在所有相关的配置文件中正确设置和删除环境变量,并刷新当前会话,使更改生效。通过这些措施,能够确保系统环境变量的正确性和一致性。
57 1
|
4月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
83 6
|
5月前
|
算法 Java Linux
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
这篇文章讨论了在Linux环境下使用Java Graphics2D合成图片时遇到的中文显示问题,并提供了解决方案,包括如何在Linux系统中添加中文字体库。
80 1
java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
|
5月前
|
Java Linux
java读取linux服务器下某文档的内容
java读取linux服务器下某文档的内容
61 3
java读取linux服务器下某文档的内容
|
5月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
225 1
|
5月前
|
算法 Java Linux
java制作海报五:java 后端整合 echarts 画出 折线图,项目放在linux上,echarts图上不显示中文,显示方框口口口
这篇文章介绍了如何在Java后端整合ECharts库来绘制折线图,并讨论了在Linux环境下ECharts图表中文显示问题。
112 1
|
6月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
77 5
|
6月前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
115 4
|
6月前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决