Java工具-使用JDK自带工具查看字节码指令和线程运行状态

一、使用javap反编译查看字节码指令

第一步:找到我们要反编译的类的.class文件所在的位置,我学习Concurrence的代码的class全部放在D:\Java_Program\JavaBasic\out\production\JavaBasic\Concurrence。
这里写图片描述
第二步:复制上面的路径,进入Power Shell中(Win7是cmd中,我的是Win10)

PS C:\WINDOWS\system32> cd D:\Java_Program\JavaBasic\out\production\JavaBasic\Concurrence
PS D:\Java_Program\JavaBasic\out\production\JavaBasic\Concurrence>

第三步:运行下面的命令和你需要反编译的class文件名,

PS D:\Java_Program\JavaBasic\out\production\JavaBasic\Concurrence> javap -c SleepAndWait

第四步:得到反编译的二进制文件结果

警告: 二进制文件SleepAndWait包含Concurrence.SleepAndWait
Compiled from "SleepAndWait.java"
public class Concurrence.SleepAndWait {
  public Concurrence.SleepAndWait();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/lang/Thread
       3: dup
       4: new           #3                  // class Concurrence/Thread1
       7: dup
       8: invokespecial #4                  // Method Concurrence/Thread1."<init>":()V
      11: invokespecial #5                  // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
      14: invokevirtual #6                  // Method java/lang/Thread.start:()V
      17: ldc2_w        #7                  // long 5000l
      20: invokestatic  #9                  // Method java/lang/Thread.sleep:(J)V
      23: goto          31
      26: astore_1
      27: aload_1
      28: invokevirtual #11                 // Method java/lang/InterruptedException.printStackTrace:()V
      31: new           #2                  // class java/lang/Thread
      34: dup
      35: new           #12                 // class Concurrence/Thread2
      38: dup
      39: invokespecial #13                 // Method Concurrence/Thread2."<init>":()V
      42: invokespecial #5                  // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
      45: invokevirtual #6                  // Method java/lang/Thread.start:()V
      48: return
    Exception table:
       from    to  target type
          17    23    26   Class java/lang/InterruptedException
}

如果我们想要得到更详细的信息,可以运行下面的命令(推荐使用)

PS D:\Java_Program\JavaBasic\out\production\JavaBasic\Concurrence> javap -verbose SleepAndWait

反编译得到的信息

警告: 二进制文件SleepAndWait包含Concurrence.SleepAndWait
Classfile /D:/Java_Program/JavaBasic/out/production/JavaBasic/Concurrence/SleepAndWait.class
  Last modified 2018-7-28; size 798 bytes
  MD5 checksum 7f5f4f64266bcbfe4ac1d2f452c8ade1
  Compiled from "SleepAndWait.java"
public class Concurrence.SleepAndWait
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #15.#33        // java/lang/Object."<init>":()V
   #2 = Class              #34            // java/lang/Thread
   #3 = Class              #35            // Concurrence/Thread1
   #4 = Methodref          #3.#33         // Concurrence/Thread1."<init>":()V
   #5 = Methodref          #2.#36         // java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
   #6 = Methodref          #2.#37         // java/lang/Thread.start:()V
   #7 = Long               5000l
   #9 = Methodref          #2.#38         // java/lang/Thread.sleep:(J)V
  #10 = Class              #39            // java/lang/InterruptedException
  #11 = Methodref          #10.#40        // java/lang/InterruptedException.printStackTrace:()V
  #12 = Class              #41            // Concurrence/Thread2
  #13 = Methodref          #12.#33        // Concurrence/Thread2."<init>":()V
  #14 = Class              #42            // Concurrence/SleepAndWait
  #15 = Class              #43            // java/lang/Object
  #16 = Utf8               <init>
  #17 = Utf8               ()V
  #18 = Utf8               Code
  #19 = Utf8               LineNumberTable
  #20 = Utf8               LocalVariableTable
  #21 = Utf8               this
  #22 = Utf8               LConcurrence/SleepAndWait;
  #23 = Utf8               main
  #24 = Utf8               ([Ljava/lang/String;)V
  #25 = Utf8               e
  #26 = Utf8               Ljava/lang/InterruptedException;
  #27 = Utf8               args
  #28 = Utf8               [Ljava/lang/String;
  #29 = Utf8               StackMapTable
  #30 = Class              #39            // java/lang/InterruptedException
  #31 = Utf8               SourceFile
  #32 = Utf8               SleepAndWait.java
  #33 = NameAndType        #16:#17        // "<init>":()V
  #34 = Utf8               java/lang/Thread
  #35 = Utf8               Concurrence/Thread1
  #36 = NameAndType        #16:#44        // "<init>":(Ljava/lang/Runnable;)V
  #37 = NameAndType        #45:#17        // start:()V
  #38 = NameAndType        #46:#47        // sleep:(J)V
  #39 = Utf8               java/lang/InterruptedException
  #40 = NameAndType        #48:#17        // printStackTrace:()V
  #41 = Utf8               Concurrence/Thread2
  #42 = Utf8               Concurrence/SleepAndWait
  #43 = Utf8               java/lang/Object
  #44 = Utf8               (Ljava/lang/Runnable;)V
  #45 = Utf8               start
  #46 = Utf8               sleep
  #47 = Utf8               (J)V
  #48 = Utf8               printStackTrace
{
  public Concurrence.SleepAndWait();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   LConcurrence/SleepAndWait;

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=4, locals=2, args_size=1
         0: new           #2                  // class java/lang/Thread
         3: dup
         4: new           #3                  // class Concurrence/Thread1
         7: dup
         8: invokespecial #4                  // Method Concurrence/Thread1."<init>":()V
        11: invokespecial #5                  // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
        14: invokevirtual #6                  // Method java/lang/Thread.start:()V
        17: ldc2_w        #7                  // long 5000l
        20: invokestatic  #9                  // Method java/lang/Thread.sleep:(J)V
        23: goto          31
        26: astore_1
        27: aload_1
        28: invokevirtual #11                 // Method java/lang/InterruptedException.printStackTrace:()V
        31: new           #2                  // class java/lang/Thread
        34: dup
        35: new           #12                 // class Concurrence/Thread2
        38: dup
        39: invokespecial #13                 // Method Concurrence/Thread2."<init>":()V
        42: invokespecial #5                  // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
        45: invokevirtual #6                  // Method java/lang/Thread.start:()V
        48: return
      Exception table:
         from    to  target type
            17    23    26   Class java/lang/InterruptedException
      LineNumberTable:
        line 5: 0
        line 8: 17
        line 11: 23
        line 9: 26
        line 10: 27
        line 12: 31
        line 13: 48
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
           27       4     1     e   Ljava/lang/InterruptedException;
            0      49     0  args   [Ljava/lang/String;
      StackMapTable: number_of_entries = 2
        frame_type = 90 /* same_locals_1_stack_item */
          stack = [ class java/lang/InterruptedException ]
        frame_type = 4 /* same */
}
SourceFile: "SleepAndWait.java"

使用jstack可以查看线程信息

猜你喜欢

转载自blog.csdn.net/makeliwei1/article/details/81297081