首頁 > Java > java教程 > jstack指令詳解

jstack指令詳解

藏色散人
發布: 2020-10-22 10:14:08
原創
5771 人瀏覽過

jstack指令可以用來查看執行的Java進程下,多執行緒的運行情況,語句如「[root@admin ~]# jstack 43616 Full thread dump Java HotSpot(TM) 64-Bit Server...」。

jstack指令詳解

推薦:《java教學

Java jstack 指令詳解

Java 中jstack 指令可以用來檢視執行的Java 行程下,多執行緒的運作情況,我們用一個死鎖的範例來看:

例如下面這段死鎖的程式碼:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

public class DeadLock {

    private static Object objA = new Object();

    private static Object objB = new Object();

    public static void main(String[] args) {

        Thread thread1 = new Thread(new Thread1());

        Thread thread2 = new Thread(new Thread2());

        thread1.start();

        thread2.start();

    }

    private static class Thread1 implements Runnable{

        @Override

        public void run() {

            synchronized (objA) {

                System.out.println("线程1得到A对象的锁");

                try {

                    Thread.sleep(3000);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                synchronized (objB) {

                    System.out.println("线程1得到B对象的锁");

                }

            }

        }

    }

    private static class Thread2 implements Runnable{

        @Override

        public void run() {

            synchronized (objB) {

                System.out.println("线程2得到B对象的锁");

                try {

                    Thread.sleep(3000);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                synchronized (objA) {

                    System.out.println("线程2得到A对象的锁");

                }

            }

        }  

    }

}

登入後複製

當然,運行結果只能看到兩個執行緒只拿到了一個鎖,在一直等待對方的鎖。

1

2

线程1得到A对象的锁

线程2得到B对象的锁

登入後複製

我們可以使用jps 來查看對應的PID ,然後使用jstack 來查看其線程情況:

1

2

3

[root@admin ~]# jps

42576 Jps

43616 DeadLock

登入後複製

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

[root@admin ~]# jstack 43616

Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.45-b08 mixed mode):

"DestroyJavaVM" prio=6 tid=0x00000000047c1000 nid=0x9878 waiting on condition [0x0000000000000000]

   java.lang.Thread.State: RUNNABLE

"Thread-1" prio=6 tid=0x0000000010aa3000 nid=0xafa0 waiting for monitor entry [0x000000001105f000]

   java.lang.Thread.State: BLOCKED (on object monitor)

        at com.zaimeibian.Test$Thread2.run(Test.java:46)

        - waiting to lock <0x00000007c099cc20> (a java.lang.Object)

        - locked <0x00000007c099cc30> (a java.lang.Object)

        at java.lang.Thread.run(Thread.java:744)

"Thread-0" prio=6 tid=0x0000000010aa2800 nid=0xae74 waiting for monitor entry [0x0000000010f5f000]

   java.lang.Thread.State: BLOCKED (on object monitor)

        at com.zaimeibian.Test$Thread1.run(Test.java:27)

        - waiting to lock <0x00000007c099cc30> (a java.lang.Object)

        - locked <0x00000007c099cc20> (a java.lang.Object)

        at java.lang.Thread.run(Thread.java:744)

"Service Thread" daemon prio=6 tid=0x000000000f10a000 nid=0x9a8c runnable [0x0000000000000000]

   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio=10 tid=0x000000000f109800 nid=0xaf28 waiting on condition [0x0000000000000000]

   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio=10 tid=0x000000000f105800 nid=0x85dc waiting on condition [0x0000000000000000]

   java.lang.Thread.State: RUNNABLE

"Attach Listener" daemon prio=10 tid=0x000000000f104800 nid=0xac04 waiting on condition [0x0000000000000000]

   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x000000000f102000 nid=0xa678 runnable [0x0000000000000000]

   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=8 tid=0x000000000f0bd000 nid=0xaed8 in Object.wait() [0x000000001045f000]

   java.lang.Thread.State: WAITING (on object monitor)

        at java.lang.Object.wait(Native Method)

        - waiting on <0x00000007c0905568> (a java.lang.ref.ReferenceQueue$Lock)

        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)

        - locked <0x00000007c0905568> (a java.lang.ref.ReferenceQueue$Lock)

        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)

        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

"Reference Handler" daemon prio=10 tid=0x000000000f0b2000 nid=0xaedc in Object.wait() [0x000000001035f000]

   java.lang.Thread.State: WAITING (on object monitor)

        at java.lang.Object.wait(Native Method)

        - waiting on <0x00000007c09050f0> (a java.lang.ref.Reference$Lock)

        at java.lang.Object.wait(Object.java:503)

        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)

        - locked <0x00000007c09050f0> (a java.lang.ref.Reference$Lock)

"VM Thread" prio=10 tid=0x000000000f0b0000 nid=0xaef0 runnable

"GC task thread#0 (ParallelGC)" prio=6 tid=0x00000000047d6000 nid=0xacb0 runnable

"GC task thread#1 (ParallelGC)" prio=6 tid=0x00000000047d8000 nid=0xaee0 runnable

"GC task thread#2 (ParallelGC)" prio=6 tid=0x00000000047d9800 nid=0xaed4 runnable

"GC task thread#3 (ParallelGC)" prio=6 tid=0x00000000047db000 nid=0xac54 runnable

"VM Periodic Task Thread" prio=10 tid=0x000000000f132000 nid=0xaff0 waiting on condition

JNI global references: 105

Found one Java-level deadlock:

=============================

"Thread-1":

  waiting to lock monitor 0x000000000f0ba488 (object 0x00000007c099cc20, a java.lang.Object),

  which is held by "Thread-0"

"Thread-0":

  waiting to lock monitor 0x000000000f0bcf28 (object 0x00000007c099cc30, a java.lang.Object),

  which is held by "Thread-1"

Java stack information for the threads listed above:

===================================================

"Thread-1":

        at com.zaimeibian.Test$Thread2.run(Test.java:46)

        - waiting to lock <0x00000007c099cc20> (a java.lang.Object)

        - locked <0x00000007c099cc30> (a java.lang.Object)

        at java.lang.Thread.run(Thread.java:744)

"Thread-0":

        at com.zaimeibian.Test$Thread1.run(Test.java:27)

        - waiting to lock <0x00000007c099cc30> (a java.lang.Object)

        - locked <0x00000007c099cc20> (a java.lang.Object)

        at java.lang.Thread.run(Thread.java:744)

Found 1 deadlock.

登入後複製

我們可以看到jstack 打印出了線程的狀態,而且發現一個死鎖。

另外,執行緒狀態有以下幾種:

- RUNNABLE 執行緒運行中或I/O 等待

- BLOCKED 執行緒在等待monitor 鎖定( synchronized 關鍵字)

- TIMED_WAITING 執行緒在等待喚醒,但設定了時限

- WAITING 執行緒在無限等待喚醒

以上是jstack指令詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板