`
liuyes
  • 浏览: 53599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用jvm thread dumps查看程序死锁

 
阅读更多

产生死锁测试代码如下:

package test;

public class DeathLockTest {
	private static final String A="a";
	private static final String B="b";
	
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				testA();
				
			}
		});
		Thread t2 = new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				testB();
				
			}
		});
		t1.start();
		t2.start();
	}
	
	public static void testA(){
		synchronized (A) {
			try {
				Thread.sleep(1100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (B) {
				System.out.println("aaa->bbb");
			}
		}
	}
	
	public static void testB(){
		synchronized (B) {
			synchronized (A) {
				System.out.println("bbb->aaa");
			}
		}
	}
}

 

两个方法testA和testB中是典型的锁对象顺序不当产生的死锁

我们在命令行下运行这个程序,将会死锁,程序停止响应。

这时我们按下ctrl+break,输出的信息中其中有这么一段:

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at test.DeathLockTest.testB(DeathLockTest.java:49)
        - waiting to lock <0x37a4d840> (a java.lang.String)      //等待<0x37a4d840>上的锁
        - locked <0x37a4d858> (a java.lang.String)                  //已锁定<0x37a4d858>
        at test.DeathLockTest$2.run(DeathLockTest.java:25)
        at java.lang.Thread.run(Unknown Source)
"Thread-0":
        at test.DeathLockTest.testA(DeathLockTest.java:41)
        - waiting to lock <0x37a4d858> (a java.lang.String)      //等待<0x37a4d858>上的锁
        - locked <0x37a4d840> (a java.lang.String)                  //已锁定<0x37a4d840>
        at test.DeathLockTest$1.run(DeathLockTest.java:12)
        at java.lang.Thread.run(Unknown Source)

Found 1 deadlock.

 可以很容易的看出两个线程互相等待对方锁定的对象,造成死锁

 

 

0
5
分享到:
评论

相关推荐

    Java Thread Dumps 分析

    在《Analyzing Java Thread Dumps.pdf》和《Java Thread Dumps 分析.pdf》这两份文档中,你可以深入理解以下几个关键知识点: 1. **线程状态**:Java线程有六种基本状态,包括新建(New)、可运行(Runnable)、...

    Java解决死锁问题eclipse代码版

    在Java编程中,死锁是多线程环境下常见的问题,当两个或多个线程相互等待对方释放资源,...通过合理设计同步策略、限制锁的范围以及避免嵌套锁和循环等待,可以有效地降低死锁发生的概率,提高程序的并发性能和稳定性。

    jvm内存状况查看

    本文将深入探讨如何查看和分析JVM的内存状态,特别是通过输出GC日志。 首先,让我们了解JVM内存的基本结构。JVM内存主要分为年轻代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation...

    jdk,jvm源码

    了解JVM源码可以帮助我们深入理解Java程序的运行过程,优化内存使用,提升程序性能,排查故障。例如,通过阅读垃圾回收器的源码,我们可以学习如何调整参数以适应不同的应用场景;通过分析类加载机制,可以实现...

    java 查看JVM中所有的线程的活动状况

    在Java编程环境中,了解JVM(Java虚拟机)中所有线程的...总结来说,Java提供了多种方式来查看JVM中的线程活动状况,无论是通过编程还是使用命令行工具,都能帮助开发者诊断和优化多线程程序,确保程序的稳定性和性能。

    基于Java的源码-多线程程序死锁检查 JCarder.zip

    通过理解和使用JCarder,开发者能够更好地理解和解决多线程程序中的死锁问题,提升程序的稳定性和可靠性。在实际开发中,结合良好的编程习惯和设计原则,可以有效地预防和避免死锁,保证Java应用程序的高效运行。

    基于java的多线程程序死锁检查 JCarder.zip

    Java多线程编程是开发高并发应用的重要...总的来说,理解和使用JCarder对于解决Java多线程程序中的死锁问题至关重要。通过合理的编程习惯和使用专业的分析工具,我们可以有效避免死锁,提高多线程程序的稳定性和效率。

    基于Java的多线程程序死锁检查 JCarder.zip

    4. **JVM内置检测**:Java虚拟机(JVM)提供了一些内置的工具,如`jstack`,可以打印出线程的堆栈信息,帮助分析是否存在死锁。 5. **JCarder工具**:`JCarder`是一个专门针对Java多线程死锁的检测工具,它通过分析...

    Java中的死锁:理解、避免与解决策略

    死锁是Java并发编程中的一个常见问题,它需要开发者有深入的理解并采取有效的策略来避免。...同时,利用JVM提供的工具进行死锁检测也是确保程序稳定性的重要手段。通过这些方法,可以提高程序的健壮性和性能。

    JVM监控工具使用入门

    jconsole是一款轻量级的监控工具,主要功能包括查看JVM的状态信息、线程信息、内存使用情况等。虽然它的功能相对较少,但对于初级用户来说已经足够使用。通过jconsole,用户可以直观地看到JVM的CPU使用率、堆内存...

    jvm.dll应用程序下载软件链接

    jvm.dll应用程序,是开发PYCHARM常用的一个连接,所以能下载

    基于Java的实例源码-多线程程序死锁检查 JCarder.zip

    通过学习和使用`JCarder`,开发者可以更好地理解和处理多线程程序中的死锁问题,提升程序的稳定性和性能。在实际项目中,结合良好的编程习惯和适当的工具,可以有效地避免死锁,确保多线程环境下的高效并发执行。

    jvm内存监控工具使用

    通过 jstack,你可以查看每个线程的当前状态和执行路径,从而定位潜在的性能瓶颈或死锁原因。 #### JConsole:全面的监控与管理控制台 JConsole 是一个图形化工具,提供了丰富的监控功能,包括但不限于内存使用、...

    jvm死锁jar包用于排查学习

    jvm死锁jar包用于排查学习

    监控jvm资源利用,查看应用程序的资源占用情况

    VisualVM是一款强大的多合一JVM工具,它提供了一种直观的方式来查看和分析Java应用程序的资源占用情况。 VisualVM主要功能包括: 1. **JVM概览**:显示JVM的基本信息,如版本、操作系统、CPU和内存配置。此外,它...

    一个面向Ruby、基于Java虚拟机(JVM)的解释程序

    jvm,JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。适用人群:计算机,电子信息工程、数学等专业的大学生课程设计、期末大...

    JVM Thread Stack线程栈分析

    JVM Thread Stack线程栈分析

Global site tag (gtag.js) - Google Analytics