zoukankan      html  css  js  c++  java
  • Java如何查看死锁?

    转载自 https://blog.csdn.net/u014039577/article/details/52351626

    Java中当我们的开发涉及到多线程的时候,这个时候就很容易遇到死锁问题,刚开始遇到死锁问题的时候,我们很容易觉得莫名其妙,而且定位问题也很困难。

    因为涉及到java多线程的时候,有的问题会特别复杂,而且就算我们知道问题出现是因为死锁了,我们也很难弄清楚为什么发生死锁,那么当我们遇到了死锁问题,我们应该如何来检测和查看死锁呢?

    Java中jdk 给我们提供了很便利的工具,帮助我们定位和分析死锁问题:

    1、死锁产生原因:当两个或者多个线程互相持有一定资源,并互相等待其他线程释放资源而形成的一种僵局,就是死锁。

    2、构建一个死锁的场景:

    1.  
      public class Test {
    2.  
       
    3.  
      public static void main(String[] args) {
    4.  
      new Thread(new Runnable() {
    5.  
       
    6.  
      @Override
    7.  
      public void run() {
    8.  
      synchronized (B.class) {
    9.  
      try {
    10.  
      Thread.sleep(1000);
    11.  
      } catch (InterruptedException e) {
    12.  
      e.printStackTrace();
    13.  
      }
    14.  
      synchronized (A.class) {
    15.  
       
    16.  
      }
    17.  
      }
    18.  
      }
    19.  
      }).start();
    20.  
      new Thread(new Runnable() {
    21.  
       
    22.  
      @Override
    23.  
      public void run() {
    24.  
      synchronized (A.class) {
    25.  
      try {
    26.  
      Thread.sleep(1000);
    27.  
      } catch (InterruptedException e) {
    28.  
      // TODO Auto-generated catch block
    29.  
      e.printStackTrace();
    30.  
      }
    31.  
      synchronized (B.class) {
    32.  
       
    33.  
      }
    34.  
      }
    35.  
       
    36.  
      }
    37.  
      }).start();
    38.  
      }
    39.  
       
    40.  
      }
    41.  
      class A {
    42.  
       
    43.  
      }
    44.  
       
    45.  
      class B {
    46.  
       
    47.  
      }

    可以看到运行时,一个线程持有A资源,希望使用B资源,而另一个线程持有B资源,希望使用A 资源,然后就陷入了相互等待的僵局,这样就形成了死锁。

    3、Jconsole查看死锁

    进入java安装的位置,输入Jconsole,然后弹出界面(或者进入安装目录/java/jdk1.70_80/bin/,点击Jconsole.exe):

    然后点击进入:

    然后点击检测死锁:

    然后可以看到造成死锁的两个线程,以及死锁原因:

    Thread-0:持有java.lang.Class@1694ce18,需要java.lang.Class@1feb0edd,但是java.lang.Class@1feb0edd却被Thread-1持有,然后陷入等待。

    Thread-1:持有java.lang.Class@1feb0edd,需要java.lang.Class@1694ce18,但是java.lang.Class@1694ce18却被Thread-0持有,然后陷入等待。

    4、Jstack查看死锁:

    同样,也是进入jdk安装目录的bin下面,输入jps,先查看我们要检测死锁的进程:

    然后可以看到进程Test的进程号:8384,然后执行:Jstack -l 8384

    查看死锁信息:

  • 相关阅读:
    GIT在Linux上的安装和使用简介心得
    Android开发环境使用到工具的认识心得
    Android系统移植与驱动开发心得
    嵌入式Linux的调试技术
    硬件抽象层——HAL
    Linux代码的重用与强行卸载Linux驱动
    控制发光二极管
    详细讲解Linux驱动程序
    搭建测试环境——针对S3C6410开发板
    有了源代码,当然还需要编译喽!!
  • 原文地址:https://www.cnblogs.com/bootdo/p/10481771.html
Copyright © 2011-2022 走看看