查询java类编译后的执行指令

编译前CLASS信息:

public class LockExample {

    private static int i;
    private static int j;
    private static int k;

    private static volatile int state;

    public static void main(String[] args) {
        LockExample lockExample = new LockExample();
        lockExample.innerSynch();

    }

    public LockExample(){
        i = 2;
        state = 1;
    }

    public  void innerSynch(){
        synchronized(this){
            System.out.println("[ get inner lock ] success");
            i++;
            j++;
            state ++;
            k++;
            try {
                this.wait();
            }catch (InterruptedException ex){

            }
            notifyAll();
            System.out.println("[ notifyAll ] ... ...");
        }

    }


}
LockExample 源码

 

通过IDEA 编译源码获得 LockExample.class文件

即执行:C:\Users\Administrator\Desktop> javac  LockExample.java

然后,基于Class文件,再执行如下指令:

# 指令格式:javap -v -p  Class文件名字,不需要加.class
C:\Users\Administrator\Desktop>javap -v -p LockExample 

控制台就会打印出该类的JVM指令:

  1 com.clouds.example.service.lock.LockExample
  2 Classfile /C:/Users/Administrator/Desktop/LockExample.class
  3   Last modified 2020-8-31; size 995 bytes
  4   MD5 checksum 60688e87f173f11c4571151844f8d0bf
  5   Compiled from "LockExample.java"
  6 public class com.clouds.example.service.lock.LockExample
  7   minor version: 0
  8   major version: 52
  9   flags: ACC_PUBLIC, ACC_SUPER
 10 Constant pool:
 11    #1 = Class              #36            // com/clouds/example/service/lock/LockExample
 12    #2 = Methodref          #1.#37         // com/clouds/example/service/lock/LockExample."<init>":()V
 13    #3 = Methodref          #1.#38         // com/clouds/example/service/lock/LockExample.innerSynch:()V
 14    #4 = Methodref          #16.#37        // java/lang/Object."<init>":()V
 15    #5 = Fieldref           #1.#39         // com/clouds/example/service/lock/LockExample.i:I
 16    #6 = Fieldref           #1.#40         // com/clouds/example/service/lock/LockExample.state:I
 17    #7 = Fieldref           #41.#42        // java/lang/System.out:Ljava/io/PrintStream;
 18    #8 = String             #43            // [ get inner lock ] success
 19    #9 = Methodref          #44.#45        // java/io/PrintStream.println:(Ljava/lang/String;)V
 20   #10 = Fieldref           #1.#46         // com/clouds/example/service/lock/LockExample.j:I
 21   #11 = Fieldref           #1.#47         // com/clouds/example/service/lock/LockExample.k:I
 22   #12 = Methodref          #16.#48        // java/lang/Object.wait:()V
 23   #13 = Class              #49            // java/lang/InterruptedException
 24   #14 = Methodref          #16.#50        // java/lang/Object.notifyAll:()V
 25   #15 = String             #51            // [ notifyAll ] ... ...
 26   #16 = Class              #52            // java/lang/Object
 27   #17 = Utf8               i
 28   #18 = Utf8               I
 29   #19 = Utf8               j
 30   #20 = Utf8               k
 31   #21 = Utf8               state
 32   #22 = Utf8               main
 33   #23 = Utf8               ([Ljava/lang/String;)V
 34   #24 = Utf8               Code
 35   #25 = Utf8               LineNumberTable
 36   #26 = Utf8               <init>
 37   #27 = Utf8               ()V
 38   #28 = Utf8               innerSynch
 39   #29 = Utf8               StackMapTable
 40   #30 = Class              #36            // com/clouds/example/service/lock/LockExample
 41   #31 = Class              #52            // java/lang/Object
 42   #32 = Class              #49            // java/lang/InterruptedException
 43   #33 = Class              #53            // java/lang/Throwable
 44   #34 = Utf8               SourceFile
 45   #35 = Utf8               LockExample.java
 46   #36 = Utf8               com/clouds/example/service/lock/LockExample
 47   #37 = NameAndType        #26:#27        // "<init>":()V
 48   #38 = NameAndType        #28:#27        // innerSynch:()V
 49   #39 = NameAndType        #17:#18        // i:I
 50   #40 = NameAndType        #21:#18        // state:I
 51   #41 = Class              #54            // java/lang/System
 52   #42 = NameAndType        #55:#56        // out:Ljava/io/PrintStream;
 53   #43 = Utf8               [ get inner lock ] success
 54   #44 = Class              #57            // java/io/PrintStream
 55   #45 = NameAndType        #58:#59        // println:(Ljava/lang/String;)V
 56   #46 = NameAndType        #19:#18        // j:I
 57   #47 = NameAndType        #20:#18        // k:I
 58   #48 = NameAndType        #60:#27        // wait:()V
 59   #49 = Utf8               java/lang/InterruptedException
 60   #50 = NameAndType        #61:#27        // notifyAll:()V
 61   #51 = Utf8               [ notifyAll ] ... ...
 62   #52 = Utf8               java/lang/Object
 63   #53 = Utf8               java/lang/Throwable
 64   #54 = Utf8               java/lang/System
 65   #55 = Utf8               out
 66   #56 = Utf8               Ljava/io/PrintStream;
 67   #57 = Utf8               java/io/PrintStream
 68   #58 = Utf8               println
 69   #59 = Utf8               (Ljava/lang/String;)V
 70   #60 = Utf8               wait
 71   #61 = Utf8               notifyAll
 72 {
 73   private static int i;
 74     descriptor: I
 75     flags: ACC_PRIVATE, ACC_STATIC
 76 
 77   private static int j;
 78     descriptor: I
 79     flags: ACC_PRIVATE, ACC_STATIC
 80 
 81   private static int k;
 82     descriptor: I
 83     flags: ACC_PRIVATE, ACC_STATIC
 84 
 85   private static volatile int state;
 86     descriptor: I
 87     flags: ACC_PRIVATE, ACC_STATIC, ACC_VOLATILE
 88 
 89   public static void main(java.lang.String[]);
 90     descriptor: ([Ljava/lang/String;)V
 91     flags: ACC_PUBLIC, ACC_STATIC
 92     Code:
 93       stack=2, locals=2, args_size=1
 94          0: new           #1                  // class com/clouds/example/service/lock/LockExample
 95          3: dup
 96          4: invokespecial #2                  // Method "<init>":()V
 97          7: astore_1
 98          8: aload_1
 99          9: invokevirtual #3                  // Method innerSynch:()V
100         12: return
101       LineNumberTable:
102         line 12: 0
103         line 13: 8
104         line 15: 12
105 
106   public com.clouds.example.service.lock.LockExample();
107     descriptor: ()V
108     flags: ACC_PUBLIC
109     Code:
110       stack=1, locals=1, args_size=1
111          0: aload_0
112          1: invokespecial #4                  // Method java/lang/Object."<init>":()V
113          4: iconst_2
114          5: putstatic     #5                  // Field i:I
115          8: iconst_1
116          9: putstatic     #6                  // Field state:I
117         12: return
118       LineNumberTable:
119         line 17: 0
120         line 18: 4
121         line 19: 8
122         line 20: 12
123 
124   public void innerSynch();
125     descriptor: ()V
126     flags: ACC_PUBLIC
127     Code:
128       stack=2, locals=4, args_size=1
129          0: aload_0
130          1: dup
131          2: astore_1
132          3: monitorenter
133          4: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
134          7: ldc           #8                  // String [ get inner lock ] success
135          9: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
136         12: getstatic     #5                  // Field i:I
137         15: iconst_1
138         16: iadd
139         17: putstatic     #5                  // Field i:I
140         20: getstatic     #10                 // Field j:I
141         23: iconst_1
142         24: iadd
143         25: putstatic     #10                 // Field j:I
144         28: getstatic     #6                  // Field state:I
145         31: iconst_1
146         32: iadd
147         33: putstatic     #6                  // Field state:I
148         36: getstatic     #11                 // Field k:I
149         39: iconst_1
150         40: iadd
151         41: putstatic     #11                 // Field k:I
152         44: aload_0
153         45: invokevirtual #12                 // Method java/lang/Object.wait:()V
154         48: goto          52
155         51: astore_2
156         52: aload_0
157         53: invokevirtual #14                 // Method java/lang/Object.notifyAll:()V
158         56: getstatic     #7                  // Field java/lang/System.out:Ljava/io/PrintStream;
159         59: ldc           #15                 // String [ notifyAll ] ... ...
160         61: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
161         64: aload_1
162         65: monitorexit
163         66: goto          74
164         69: astore_3
165         70: aload_1
166         71: monitorexit
167         72: aload_3
168         73: athrow
169         74: return
170       Exception table:
171          from    to  target type
172             44    48    51   Class java/lang/InterruptedException
173              4    66    69   any
174             69    72    69   any
175       LineNumberTable:
176         line 23: 0
177         line 24: 4
178         line 25: 12
179         line 26: 20
180         line 27: 28
181         line 28: 36
182         line 30: 44
183         line 33: 48
184         line 31: 51
185         line 34: 52
186         line 35: 56
187         line 36: 64
188         line 38: 74
189       StackMapTable: number_of_entries = 4
190         frame_type = 255 /* full_frame */
191           offset_delta = 51
192           locals = [ class com/clouds/example/service/lock/LockExample, class java/lang/Object ]
193           stack = [ class java/lang/InterruptedException ]
194         frame_type = 0 /* same */
195         frame_type = 80 /* same_locals_1_stack_item */
196           stack = [ class java/lang/Throwable ]
197         frame_type = 250 /* chop */
198           offset_delta = 4
199 }
200 SourceFile: "LockExample.java"
View Code

从上面的jvm指令中发现,volatile修饰的state只是比其它几个多了一个volatile关键字的标记,其它地地方的jvm指令一摸一样;

接下来再将它的汇编指令扒出来看看;

 

通过Class看汇编的方式:

第一步:需要 hsdis-amd64.dll 打印java的汇编文件(至于如何创建该文件,则以后再研究,由于我是再windows上操作,所以是dll文件,如果是linux则后缀应该是.so文件)

需要将hsdis-amd64.dll 放到JAVA_HOME\jre\bin\server目录下

第二步:基于Class文件执行如下命令,运行并打印执行的汇编指令:

C:\Users\Administrator\Desktop> java  -Xcomp   /
    -XX:+UnlockDiagnosticVMOptions  /
    -XX:+PrintAssembly  /
    -XX:CompileCommand=dontinline,LockExample.innerSynch   /
    -XX:CompileCommand=compileonly,LockExample.innerSynch   /
    LockExample > sync1

结果输入到文件:sync1

  1 CompilerOracle: dontinline LockExample.innerSynch
  2 CompilerOracle: compileonly LockExample.innerSynch
  3 Loaded disassembler from hsdis-amd64.dll
  4 Decoding compiled method 0x0000000003324910:
  5 Code:
  6 [Disassembling for mach='i386:x86-64']
  7 [Entry Point]
  8 [Constants]
  9   # {method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample'
 10   #           [sp+0x50]  (sp of caller)
 11   0x0000000003324ac0: mov    0x8(%rdx),%r10d
 12   0x0000000003324ac4: shl    $0x3,%r10
 13   0x0000000003324ac8: cmp    %rax,%r10
 14   0x0000000003324acb: jne    0x0000000003265f60  ;   {runtime_call}
 15   0x0000000003324ad1: data16 data16 nopw 0x0(%rax,%rax,1)
 16   0x0000000003324adc: data16 data16 xchg %ax,%ax
 17 [Verified Entry Point]
 18   0x0000000003324ae0: mov    %eax,-0x6000(%rsp)
 19   0x0000000003324ae7: push   %rbp
 20   0x0000000003324ae8: sub    $0x40,%rsp
 21   0x0000000003324aec: movabs $0x17b406a8,%rax   ;   {metadata(method data for {method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample')}
 22   0x0000000003324af6: mov    0xdc(%rax),%r8d
 23   0x0000000003324afd: add    $0x8,%r8d
 24   0x0000000003324b01: mov    %r8d,0xdc(%rax)
 25   0x0000000003324b08: movabs $0x17b40488,%rax   ;   {metadata({method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample')}
 26   0x0000000003324b12: and    $0x0,%r8d
 27   0x0000000003324b16: cmp    $0x0,%r8d
 28   0x0000000003324b1a: je     0x0000000003324e60  ;*aload_0
 29                                                 ; - LockExample::innerSynch@0 (line 23)
 30 
 31   0x0000000003324b20: lea    0x28(%rsp),%r8
 32   0x0000000003324b25: mov    %rdx,0x8(%r8)
 33   0x0000000003324b29: mov    (%rdx),%rax
 34   0x0000000003324b2c: mov    %rax,%rsi
 35   0x0000000003324b2f: and    $0x7,%rsi
 36   0x0000000003324b33: cmp    $0x5,%rsi
 37   0x0000000003324b37: jne    0x0000000003324bbe
 38   0x0000000003324b3d: mov    0x8(%rdx),%esi
 39   0x0000000003324b40: shl    $0x3,%rsi
 40   0x0000000003324b44: mov    0xa8(%rsi),%rsi
 41   0x0000000003324b4b: or     %r15,%rsi
 42   0x0000000003324b4e: xor    %rax,%rsi
 43   0x0000000003324b51: and    $0xffffffffffffff87,%rsi
 44   0x0000000003324b55: je     0x0000000003324be6
 45   0x0000000003324b5b: test   $0x7,%rsi
 46   0x0000000003324b62: jne    0x0000000003324bab
 47   0x0000000003324b64: test   $0x300,%rsi
 48   0x0000000003324b6b: jne    0x0000000003324b8a
 49   0x0000000003324b6d: and    $0x37f,%rax
 50   0x0000000003324b74: mov    %rax,%rsi
 51   0x0000000003324b77: or     %r15,%rsi
 52   0x0000000003324b7a: lock cmpxchg %rsi,(%rdx)
 53   0x0000000003324b7f: jne    0x0000000003324e77
 54   0x0000000003324b85: jmpq   0x0000000003324be6
 55   0x0000000003324b8a: mov    0x8(%rdx),%esi
 56   0x0000000003324b8d: shl    $0x3,%rsi
 57   0x0000000003324b91: mov    0xa8(%rsi),%rsi
 58   0x0000000003324b98: or     %r15,%rsi
 59   0x0000000003324b9b: lock cmpxchg %rsi,(%rdx)
 60   0x0000000003324ba0: jne    0x0000000003324e77
 61   0x0000000003324ba6: jmpq   0x0000000003324be6
 62   0x0000000003324bab: mov    0x8(%rdx),%esi
 63   0x0000000003324bae: shl    $0x3,%rsi
 64   0x0000000003324bb2: mov    0xa8(%rsi),%rsi
 65   0x0000000003324bb9: lock cmpxchg %rsi,(%rdx)
 66   0x0000000003324bbe: mov    (%rdx),%rax
 67   0x0000000003324bc1: or     $0x1,%rax
 68   0x0000000003324bc5: mov    %rax,(%r8)
 69   0x0000000003324bc8: lock cmpxchg %r8,(%rdx)
 70   0x0000000003324bcd: je     0x0000000003324be6
 71   0x0000000003324bd3: sub    %rsp,%rax
 72   0x0000000003324bd6: and    $0xfffffffffffff007,%rax
 73   0x0000000003324bdd: mov    %rax,(%r8)
 74   0x0000000003324be0: jne    0x0000000003324e77  ;*monitorenter
 75                                                 ; - LockExample::innerSynch@3 (line 23)
 76 
 77   0x0000000003324be6: mov    %rdx,0x20(%rsp)
 78   0x0000000003324beb: nopl   0x0(%rax,%rax,1)
 79   0x0000000003324bf0: jmpq   0x0000000003324ee7  ;   {no_reloc}
 80   0x0000000003324bf5: add    %al,(%rax)
 81   0x0000000003324bf7: add    %al,(%rax)
 82   0x0000000003324bf9: add    %ah,0xf(%rsi)
 83   0x0000000003324bfc: (bad)  
 84   0x0000000003324bfd: add    %r8b,(%rax)
 85   0x0000000003324c00: jmpq   0x0000000003324f02  ; implicit exception: dispatches to 0x0000000003324ef1
 86   0x0000000003324c05: nop
 87   0x0000000003324c06: nop                       ;*getstatic out
 88                                                 ; - LockExample::innerSynch@4 (line 24)
 89 
 90   0x0000000003324c07: cmp    (%rsi),%rax        ; implicit exception: dispatches to 0x0000000003324f0c
 91   0x0000000003324c0a: mov    %rsi,%r8
 92   0x0000000003324c0d: movabs $0x17b406a8,%rdi   ;   {metadata(method data for {method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample')}
 93   0x0000000003324c17: mov    0x8(%r8),%r8d
 94   0x0000000003324c1b: shl    $0x3,%r8
 95   0x0000000003324c1f: cmp    0x110(%rdi),%r8
 96   0x0000000003324c26: jne    0x0000000003324c35
 97   0x0000000003324c28: addq   $0x1,0x118(%rdi)
 98   0x0000000003324c30: jmpq   0x0000000003324c9b
 99   0x0000000003324c35: cmp    0x120(%rdi),%r8
100   0x0000000003324c3c: jne    0x0000000003324c4b
101   0x0000000003324c3e: addq   $0x1,0x128(%rdi)
102   0x0000000003324c46: jmpq   0x0000000003324c9b
103   0x0000000003324c4b: cmpq   $0x0,0x110(%rdi)
104   0x0000000003324c56: jne    0x0000000003324c6f
105   0x0000000003324c58: mov    %r8,0x110(%rdi)
106   0x0000000003324c5f: movq   $0x1,0x118(%rdi)
107   0x0000000003324c6a: jmpq   0x0000000003324c9b
108   0x0000000003324c6f: cmpq   $0x0,0x120(%rdi)
109   0x0000000003324c7a: jne    0x0000000003324c93
110   0x0000000003324c7c: mov    %r8,0x120(%rdi)
111   0x0000000003324c83: movq   $0x1,0x128(%rdi)
112   0x0000000003324c8e: jmpq   0x0000000003324c9b
113   0x0000000003324c93: addq   $0x1,0x108(%rdi)
114   0x0000000003324c9b: movabs $0xd62c7b68,%r8    ;   {oop("[ get inner lock ] success")}
115   0x0000000003324ca5: mov    %rsi,%rdx          ;*invokevirtual println
116                                                 ; - LockExample::innerSynch@9 (line 24)
117 
118   0x0000000003324ca8: nop
119   0x0000000003324ca9: nop
120   0x0000000003324caa: nop
121   0x0000000003324cab: nop
122   0x0000000003324cac: nop
123   0x0000000003324cad: movabs $0xffffffffffffffff,%rax
124   0x0000000003324cb7: callq  0x00000000032663e0  ; OopMap{[32]=Oop [48]=Oop off=508}
125                                                 ;*invokevirtual println
126                                                 ; - LockExample::innerSynch@9 (line 24)
127                                                 ;   {virtual_call}
128   0x0000000003324cbc: movabs $0xd6254880,%r8    ;   {oop(a 'java/lang/Class' = 'LockExample')}
129   0x0000000003324cc6: mov    0x68(%r8),%edx     ;*getstatic i
130                                                 ; - LockExample::innerSynch@12 (line 25)
131 
132   0x0000000003324cca: inc    %edx
133   0x0000000003324ccc: mov    %edx,0x68(%r8)     ;*putstatic i
134                                                 ; - LockExample::innerSynch@17 (line 25)
135 
136   0x0000000003324cd0: mov    0x6c(%r8),%edx     ;*getstatic j
137                                                 ; - LockExample::innerSynch@20 (line 26)
138 
139   0x0000000003324cd4: inc    %edx
140   0x0000000003324cd6: mov    %edx,0x6c(%r8)     ;*putstatic j
141                                                 ; - LockExample::innerSynch@25 (line 26)
142 
143   0x0000000003324cda: mov    0x74(%r8),%edx     ;*getstatic state
144                                                 ; - LockExample::innerSynch@28 (line 27)
145 
146   0x0000000003324cde: inc    %edx
147   0x0000000003324ce0: mov    %edx,0x74(%r8)
148   0x0000000003324ce4: lock addl $0x0,(%rsp)     ;*putstatic state
149                                                 ; - LockExample::innerSynch@33 (line 27)
150 
151   0x0000000003324ce9: mov    0x70(%r8),%edx     ;*getstatic k
152                                                 ; - LockExample::innerSynch@36 (line 28)
153 
154   0x0000000003324ced: inc    %edx
155   0x0000000003324cef: mov    %edx,0x70(%r8)     ;*putstatic k
156                                                 ; - LockExample::innerSynch@41 (line 28)
157 
158   0x0000000003324cf3: nopl   0x0(%rax,%rax,1)
159   0x0000000003324cf8: jmpq   0x0000000003324f6e  ;   {no_reloc}
160   0x0000000003324cfd: add    %al,(%rax)
161   0x0000000003324cff: add    %al,(%rax)
162   0x0000000003324d01: add    %ah,0xf(%rsi)
163   0x0000000003324d04: (bad)  
164   0x0000000003324d05: add    %r8b,(%rax)
165   0x0000000003324d08: jmpq   0x0000000003324f89  ; implicit exception: dispatches to 0x0000000003324f78
166   0x0000000003324d0d: nop
167   0x0000000003324d0e: nop                       ;*getstatic out
168                                                 ; - LockExample::innerSynch@44 (line 29)
169 
170   0x0000000003324d0f: cmp    (%rdx),%rax        ; implicit exception: dispatches to 0x0000000003324f93
171   0x0000000003324d12: mov    %rdx,%r8
172   0x0000000003324d15: movabs $0x17b406a8,%rsi   ;   {metadata(method data for {method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample')}
173   0x0000000003324d1f: mov    0x8(%r8),%r8d
174   0x0000000003324d23: shl    $0x3,%r8
175   0x0000000003324d27: cmp    0x140(%rsi),%r8
176   0x0000000003324d2e: jne    0x0000000003324d3d
177   0x0000000003324d30: addq   $0x1,0x148(%rsi)
178   0x0000000003324d38: jmpq   0x0000000003324da3
179   0x0000000003324d3d: cmp    0x150(%rsi),%r8
180   0x0000000003324d44: jne    0x0000000003324d53
181   0x0000000003324d46: addq   $0x1,0x158(%rsi)
182   0x0000000003324d4e: jmpq   0x0000000003324da3
183   0x0000000003324d53: cmpq   $0x0,0x140(%rsi)
184   0x0000000003324d5e: jne    0x0000000003324d77
185   0x0000000003324d60: mov    %r8,0x140(%rsi)
186   0x0000000003324d67: movq   $0x1,0x148(%rsi)
187   0x0000000003324d72: jmpq   0x0000000003324da3
188   0x0000000003324d77: cmpq   $0x0,0x150(%rsi)
189   0x0000000003324d82: jne    0x0000000003324d9b
190   0x0000000003324d84: mov    %r8,0x150(%rsi)
191   0x0000000003324d8b: movq   $0x1,0x158(%rsi)
192   0x0000000003324d96: jmpq   0x0000000003324da3
193   0x0000000003324d9b: addq   $0x1,0x138(%rsi)
194   0x0000000003324da3: movabs $0xd62c7bc8,%r8    ;*invokevirtual println
195                                                 ; - LockExample::innerSynch@49 (line 29)
196                                                 ;   {oop("[ notifyAll ] ... ...")}
197   0x0000000003324dad: movabs $0xffffffffffffffff,%rax
198   0x0000000003324db7: callq  0x00000000032663e0  ; OopMap{[32]=Oop [48]=Oop off=764}
199                                                 ;*invokevirtual println
200                                                 ; - LockExample::innerSynch@49 (line 29)
201                                                 ;   {virtual_call}
202   0x0000000003324dbc: lea    0x28(%rsp),%rax
203   0x0000000003324dc1: mov    0x8(%rax),%rdi
204   0x0000000003324dc5: mov    (%rdi),%rsi
205   0x0000000003324dc8: and    $0x7,%rsi
206   0x0000000003324dcc: cmp    $0x5,%rsi
207   0x0000000003324dd0: je     0x0000000003324ded
208   0x0000000003324dd6: mov    (%rax),%rsi
209   0x0000000003324dd9: test   %rsi,%rsi
210   0x0000000003324ddc: je     0x0000000003324ded
211   0x0000000003324de2: lock cmpxchg %rsi,(%rdi)
212   0x0000000003324de7: jne    0x0000000003324f98  ;*monitorexit
213                                                 ; - LockExample::innerSynch@53 (line 30)
214 
215   0x0000000003324ded: movabs $0x17b406a8,%rax   ;   {metadata(method data for {method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample')}
216   0x0000000003324df7: incl   0x168(%rax)        ;*goto
217                                                 ; - LockExample::innerSynch@54 (line 30)
218 
219   0x0000000003324dfd: add    $0x40,%rsp
220   0x0000000003324e01: pop    %rbp
221   0x0000000003324e02: test   %eax,-0x2734d08(%rip)        # 0x0000000000bf0100
222                                                 ;   {poll_return}
223   0x0000000003324e08: retq                      ;*return
224                                                 ; - LockExample::innerSynch@62 (line 32)
225 
226   0x0000000003324e09: mov    0x2a8(%r15),%rax
227   0x0000000003324e10: xor    %r10,%r10
228   0x0000000003324e13: mov    %r10,0x2a8(%r15)
229   0x0000000003324e1a: xor    %r10,%r10
230   0x0000000003324e1d: mov    %r10,0x2b0(%r15)
231   0x0000000003324e24: mov    %rax,%rsi
232   0x0000000003324e27: lea    0x28(%rsp),%rax
233   0x0000000003324e2c: mov    0x8(%rax),%rbx
234   0x0000000003324e30: mov    (%rbx),%rdi
235   0x0000000003324e33: and    $0x7,%rdi
236   0x0000000003324e37: cmp    $0x5,%rdi
237   0x0000000003324e3b: je     0x0000000003324e58
238   0x0000000003324e41: mov    (%rax),%rdi
239   0x0000000003324e44: test   %rdi,%rdi
240   0x0000000003324e47: je     0x0000000003324e58
241   0x0000000003324e4d: lock cmpxchg %rdi,(%rbx)
242   0x0000000003324e52: jne    0x0000000003324fab  ;*monitorexit
243                                                 ; - LockExample::innerSynch@59 (line 30)
244 
245   0x0000000003324e58: mov    %rsi,%rax
246   0x0000000003324e5b: jmpq   0x0000000003324fe9
247   0x0000000003324e60: mov    %rax,0x8(%rsp)
248   0x0000000003324e65: movq   $0xffffffffffffffff,(%rsp)
249   0x0000000003324e6d: callq  0x0000000003320b20  ; OopMap{rdx=Oop off=946}
250                                                 ;*synchronization entry
251                                                 ; - LockExample::innerSynch@-1 (line 23)
252                                                 ;   {runtime_call}
253   0x0000000003324e72: jmpq   0x0000000003324b20
254   0x0000000003324e77: mov    %rdx,0x8(%rsp)
255   0x0000000003324e7c: mov    %r8,(%rsp)
256   0x0000000003324e80: callq  0x000000000331ec20  ; OopMap{rdx=Oop [48]=Oop off=965}
257                                                 ;*monitorenter
258                                                 ; - LockExample::innerSynch@3 (line 23)
259                                                 ;   {runtime_call}
260   0x0000000003324e85: jmpq   0x0000000003324be6
261   0x0000000003324e8a: movabs $0x0,%r8           ;   {oop(NULL)}
262   0x0000000003324e94: push   %rax
263   0x0000000003324e95: push   %rbx
264   0x0000000003324e96: mov    0x48(%r8),%rbx
265   0x0000000003324e9a: push   %rdi
266   0x0000000003324e9b: push   %rsi
267   0x0000000003324e9c: push   %rdx
268   0x0000000003324e9d: push   %rcx
269   0x0000000003324e9e: push   %r8
270   0x0000000003324ea0: push   %r9
271   0x0000000003324ea2: push   %r10
272   0x0000000003324ea4: mov    %rsp,%r10
273   0x0000000003324ea7: and    $0xfffffffffffffff0,%rsp
274   0x0000000003324eab: push   %r10
275   0x0000000003324ead: push   %r11
276   0x0000000003324eaf: mov    $0x7,%ecx
277   0x0000000003324eb4: movabs $0x7ff816c75250,%r10  ;   {runtime_call}
278   0x0000000003324ebe: callq  *%r10
279   0x0000000003324ec1: pop    %r11
280   0x0000000003324ec3: pop    %rsp
281   0x0000000003324ec4: pop    %r10
282   0x0000000003324ec6: pop    %r9
283   0x0000000003324ec8: pop    %r8
284   0x0000000003324eca: pop    %rcx
285   0x0000000003324ecb: pop    %rdx
286   0x0000000003324ecc: pop    %rsi
287   0x0000000003324ecd: pop    %rdi
288   0x0000000003324ece: cmp    0x118(%rbx),%rax
289   0x0000000003324ed5: pop    %rbx
290   0x0000000003324ed6: pop    %rax
291   0x0000000003324ed7: jne    0x0000000003324ee7
292   0x0000000003324edd: jmpq   0x0000000003324bfa
293   0x0000000003324ee2: mov    $0xa535d00,%eax
294   0x0000000003324ee7: callq  0x000000000331fd20  ; OopMap{[32]=Oop [48]=Oop off=1068}
295                                                 ;*getstatic out
296                                                 ; - LockExample::innerSynch@4 (line 24)
297                                                 ;   {runtime_call}
298   0x0000000003324eec: jmpq   0x0000000003324bf0
299   0x0000000003324ef1: callq  0x000000000331bf80  ; OopMap{[32]=Oop r8=Oop [48]=Oop off=1078}
300                                                 ;*getstatic out
301                                                 ; - LockExample::innerSynch@4 (line 24)
302                                                 ;   {runtime_call}
303   0x0000000003324ef6: mov    0x0(%r8),%esi
304   0x0000000003324efd: mov    $0x7050c00,%eax
305   0x0000000003324f02: callq  0x000000000331f4a0  ; OopMap{[32]=Oop r8=Oop [48]=Oop off=1095}
306                                                 ;*getstatic out
307                                                 ; - LockExample::innerSynch@4 (line 24)
308                                                 ;   {runtime_call}
309   0x0000000003324f07: jmpq   0x0000000003324c00
310   0x0000000003324f0c: callq  0x000000000331bf80  ; OopMap{[32]=Oop rsi=Oop [48]=Oop off=1105}
311                                                 ;*invokevirtual println
312                                                 ; - LockExample::innerSynch@9 (line 24)
313                                                 ;   {runtime_call}
314   0x0000000003324f11: movabs $0x0,%r8           ;   {oop(NULL)}
315   0x0000000003324f1b: push   %rax
316   0x0000000003324f1c: push   %rbx
317   0x0000000003324f1d: mov    0x48(%r8),%rbx
318   0x0000000003324f21: push   %rdi
319   0x0000000003324f22: push   %rsi
320   0x0000000003324f23: push   %rdx
321   0x0000000003324f24: push   %rcx
322   0x0000000003324f25: push   %r8
323   0x0000000003324f27: push   %r9
324   0x0000000003324f29: push   %r10
325   0x0000000003324f2b: mov    %rsp,%r10
326   0x0000000003324f2e: and    $0xfffffffffffffff0,%rsp
327   0x0000000003324f32: push   %r10
328   0x0000000003324f34: push   %r11
329   0x0000000003324f36: mov    $0x7,%ecx
330   0x0000000003324f3b: movabs $0x7ff816c75250,%r10  ;   {runtime_call}
331   0x0000000003324f45: callq  *%r10
332   0x0000000003324f48: pop    %r11
333   0x0000000003324f4a: pop    %rsp
334   0x0000000003324f4b: pop    %r10
335   0x0000000003324f4d: pop    %r9
336   0x0000000003324f4f: pop    %r8
337   0x0000000003324f51: pop    %rcx
338   0x0000000003324f52: pop    %rdx
339   0x0000000003324f53: pop    %rsi
340   0x0000000003324f54: pop    %rdi
341   0x0000000003324f55: cmp    0x118(%rbx),%rax
342   0x0000000003324f5c: pop    %rbx
343   0x0000000003324f5d: pop    %rax
344   0x0000000003324f5e: jne    0x0000000003324f6e
345   0x0000000003324f64: jmpq   0x0000000003324d02
346   0x0000000003324f69: mov    $0xa535d00,%eax
347   0x0000000003324f6e: callq  0x000000000331fd20  ; OopMap{[32]=Oop [48]=Oop off=1203}
348                                                 ;*getstatic out
349                                                 ; - LockExample::innerSynch@44 (line 29)
350                                                 ;   {runtime_call}
351   0x0000000003324f73: jmpq   0x0000000003324cf8
352   0x0000000003324f78: callq  0x000000000331bf80  ; OopMap{[32]=Oop r8=Oop [48]=Oop off=1213}
353                                                 ;*getstatic out
354                                                 ; - LockExample::innerSynch@44 (line 29)
355                                                 ;   {runtime_call}
356   0x0000000003324f7d: mov    0x0(%r8),%edx
357   0x0000000003324f84: mov    $0x7050c00,%eax
358   0x0000000003324f89: callq  0x000000000331f4a0  ; OopMap{[32]=Oop r8=Oop [48]=Oop off=1230}
359                                                 ;*getstatic out
360                                                 ; - LockExample::innerSynch@44 (line 29)
361                                                 ;   {runtime_call}
362   0x0000000003324f8e: jmpq   0x0000000003324d08
363   0x0000000003324f93: callq  0x000000000331bf80  ; OopMap{[32]=Oop rdx=Oop [48]=Oop off=1240}
364                                                 ;*invokevirtual println
365                                                 ; - LockExample::innerSynch@49 (line 29)
366                                                 ;   {runtime_call}
367   0x0000000003324f98: lea    0x28(%rsp),%rax
368   0x0000000003324f9d: mov    %rax,(%rsp)
369   0x0000000003324fa1: callq  0x000000000331f060  ;   {runtime_call}
370   0x0000000003324fa6: jmpq   0x0000000003324ded
371   0x0000000003324fab: lea    0x28(%rsp),%rax
372   0x0000000003324fb0: mov    %rax,(%rsp)
373   0x0000000003324fb4: callq  0x000000000331f060  ;   {runtime_call}
374   0x0000000003324fb9: jmpq   0x0000000003324e58
375   0x0000000003324fbe: nop
376   0x0000000003324fbf: nop
377   0x0000000003324fc0: mov    0x2a8(%r15),%rax
378   0x0000000003324fc7: movabs $0x0,%r10
379   0x0000000003324fd1: mov    %r10,0x2a8(%r15)
380   0x0000000003324fd8: movabs $0x0,%r10
381   0x0000000003324fe2: mov    %r10,0x2b0(%r15)
382   0x0000000003324fe9: add    $0x40,%rsp
383   0x0000000003324fed: pop    %rbp
384   0x0000000003324fee: jmpq   0x000000000331b0a0  ;   {runtime_call}
385   0x0000000003324ff3: hlt    
386   0x0000000003324ff4: hlt    
387   0x0000000003324ff5: hlt    
388   0x0000000003324ff6: hlt    
389   0x0000000003324ff7: hlt    
390   0x0000000003324ff8: hlt    
391   0x0000000003324ff9: hlt    
392   0x0000000003324ffa: hlt    
393   0x0000000003324ffb: hlt    
394   0x0000000003324ffc: hlt    
395   0x0000000003324ffd: hlt    
396   0x0000000003324ffe: hlt    
397   0x0000000003324fff: hlt    
398 [Stub Code]
399   0x0000000003325000: nop                       ;   {no_reloc}
400   0x0000000003325001: nop
401   0x0000000003325002: nop
402   0x0000000003325003: nop
403   0x0000000003325004: nop
404   0x0000000003325005: movabs $0x0,%rbx          ;   {static_stub}
405   0x000000000332500f: jmpq   0x000000000332500f  ;   {runtime_call}
406   0x0000000003325014: nop
407   0x0000000003325015: movabs $0x0,%rbx          ;   {static_stub}
408   0x000000000332501f: jmpq   0x000000000332501f  ;   {runtime_call}
409 [Exception Handler]
410   0x0000000003325024: callq  0x000000000331e0e0  ;   {runtime_call}
411   0x0000000003325029: mov    %rsp,-0x28(%rsp)
412   0x000000000332502e: sub    $0x80,%rsp
413   0x0000000003325035: mov    %rax,0x78(%rsp)
414   0x000000000332503a: mov    %rcx,0x70(%rsp)
415   0x000000000332503f: mov    %rdx,0x68(%rsp)
416   0x0000000003325044: mov    %rbx,0x60(%rsp)
417   0x0000000003325049: mov    %rbp,0x50(%rsp)
418   0x000000000332504e: mov    %rsi,0x48(%rsp)
419   0x0000000003325053: mov    %rdi,0x40(%rsp)
420   0x0000000003325058: mov    %r8,0x38(%rsp)
421   0x000000000332505d: mov    %r9,0x30(%rsp)
422   0x0000000003325062: mov    %r10,0x28(%rsp)
423   0x0000000003325067: mov    %r11,0x20(%rsp)
424   0x000000000332506c: mov    %r12,0x18(%rsp)
425   0x0000000003325071: mov    %r13,0x10(%rsp)
426   0x0000000003325076: mov    %r14,0x8(%rsp)
427   0x000000000332507b: mov    %r15,(%rsp)
428   0x000000000332507f: movabs $0x56491820,%rcx   ;   {external_word}
429   0x0000000003325089: movabs $0x3325029,%rdx    ;   {internal_word}
430   0x0000000003325093: mov    %rsp,%r8
431   0x0000000003325096: and    $0xfffffffffffffff0,%rsp
432   0x000000000332509a: callq  0x0000000056146f40  ;   {runtime_call}
433   0x000000000332509f: hlt    
434 [Deopt Handler Code]
435   0x00000000033250a0: movabs $0x33250a0,%r10    ;   {section_word}
436   0x00000000033250aa: push   %r10
437   0x00000000033250ac: jmpq   0x0000000003267600  ;   {runtime_call}
438   0x00000000033250b1: hlt    
439   0x00000000033250b2: hlt    
440   0x00000000033250b3: hlt    
441   0x00000000033250b4: hlt    
442   0x00000000033250b5: hlt    
443   0x00000000033250b6: hlt    
444   0x00000000033250b7: hlt    
445 Decoding compiled method 0x0000000003322b10:
446 Code:
447 [Entry Point]
448 [Constants]
449   # {method} {0x0000000017b40490} 'innerSynch' '()V' in 'LockExample'
450   #           [sp+0x30]  (sp of caller)
451   0x0000000003322c40: mov    0x8(%rdx),%r10d
452   0x0000000003322c44: shl    $0x3,%r10
453   0x0000000003322c48: cmp    %r10,%rax
454   0x0000000003322c4b: jne    0x0000000003265f60  ;   {runtime_call}
455   0x0000000003322c51: data16 xchg %ax,%ax
456   0x0000000003322c54: nopl   0x0(%rax,%rax,1)
457   0x0000000003322c5c: data16 data16 xchg %ax,%ax
458 [Verified Entry Point]
459   0x0000000003322c60: mov    %eax,-0x6000(%rsp)
460   0x0000000003322c67: push   %rbp
461   0x0000000003322c68: sub    $0x20,%rsp         ;*synchronization entry
462                                                 ; - LockExample::innerSynch@-1 (line 23)
463 
464   0x0000000003322c6c: mov    %rdx,%rbp
465   0x0000000003322c6f: mov    (%rdx),%rax
466   0x0000000003322c72: mov    %rax,%r10
467   0x0000000003322c75: and    $0x7,%r10
468   0x0000000003322c79: cmp    $0x5,%r10
469   0x0000000003322c7d: jne    0x0000000003322ce6
470   0x0000000003322c7f: mov    $0x2000c005,%r11d  ;   {metadata('LockExample')}
471   0x0000000003322c85: movabs $0x0,%r10
472   0x0000000003322c8f: lea    (%r10,%r11,8),%r10
473   0x0000000003322c93: mov    0xa8(%r10),%r10
474   0x0000000003322c9a: mov    %r10,%r11
475   0x0000000003322c9d: or     %r15,%r11
476   0x0000000003322ca0: mov    %r11,%r8
477   0x0000000003322ca3: xor    %rax,%r8
478   0x0000000003322ca6: test   $0xffffffffffffff87,%r8
479   0x0000000003322cad: je     0x0000000003322cd5
480   0x0000000003322caf: test   $0x7,%r8
481   0x0000000003322cb6: jne    0x0000000003322ce1
482   0x0000000003322cb8: test   $0x300,%r8
483   0x0000000003322cbf: jne    0x0000000003322cce
484   0x0000000003322cc1: and    $0x37f,%rax
485   0x0000000003322cc8: mov    %rax,%r11
486   0x0000000003322ccb: or     %r15,%r11
487   0x0000000003322cce: lock cmpxchg %r11,(%rdx)
488   0x0000000003322cd3: jne    0x0000000003322d35  ;*monitorenter
489                                                 ; - LockExample::innerSynch@3 (line 23)
490 
491   0x0000000003322cd5: mov    $0x25,%edx
492   0x0000000003322cda: nop
493   0x0000000003322cdb: callq  0x00000000032657a0  ; OopMap{rbp=Oop off=160}
494                                                 ;*getstatic out
495                                                 ; - LockExample::innerSynch@4 (line 24)
496                                                 ;   {runtime_call}
497   0x0000000003322ce0: int3                      ;*getstatic out
498                                                 ; - LockExample::innerSynch@4 (line 24)
499 
500   0x0000000003322ce1: lock cmpxchg %r10,(%rdx)
501   0x0000000003322ce6: lea    0x10(%rsp),%rbx
502   0x0000000003322ceb: mov    (%rdx),%rax
503   0x0000000003322cee: test   $0x2,%rax
504   0x0000000003322cf4: jne    0x0000000003322d1a
505   0x0000000003322cf6: or     $0x1,%rax
506   0x0000000003322cfa: mov    %rax,(%rbx)
507   0x0000000003322cfd: lock cmpxchg %rbx,(%rdx)
508   0x0000000003322d02: je     0x0000000003322d33
509   0x0000000003322d08: sub    %rsp,%rax
510   0x0000000003322d0b: and    $0xfffffffffffff007,%rax
511   0x0000000003322d12: mov    %rax,(%rbx)
512   0x0000000003322d15: jmpq   0x0000000003322d33
513   0x0000000003322d1a: movq   $0x3,(%rbx)
514   0x0000000003322d21: mov    %rax,%rbx
515   0x0000000003322d24: mov    0x16(%rbx),%rax
516   0x0000000003322d28: test   %rax,%rax
517   0x0000000003322d2b: jne    0x0000000003322d33
518   0x0000000003322d2d: lock cmpxchg %r15,0x16(%rbx)
519   0x0000000003322d33: je     0x0000000003322cd5
520   0x0000000003322d35: lea    0x10(%rsp),%r8
521   0x0000000003322d3a: nop
522   0x0000000003322d3b: callq  0x0000000003321860  ; OopMap{rbp=Oop off=256}
523                                                 ;*monitorenter
524                                                 ; - LockExample::innerSynch@3 (line 23)
525                                                 ;   {runtime_call}
526   0x0000000003322d40: jmp    0x0000000003322cd5
527   0x0000000003322d42: hlt    
528   0x0000000003322d43: hlt    
529   0x0000000003322d44: hlt    
530   0x0000000003322d45: hlt    
531   0x0000000003322d46: hlt    
532   0x0000000003322d47: hlt    
533   0x0000000003322d48: hlt    
534   0x0000000003322d49: hlt    
535   0x0000000003322d4a: hlt    
536   0x0000000003322d4b: hlt    
537   0x0000000003322d4c: hlt    
538   0x0000000003322d4d: hlt    
539   0x0000000003322d4e: hlt    
540   0x0000000003322d4f: hlt    
541   0x0000000003322d50: hlt    
542   0x0000000003322d51: hlt    
543   0x0000000003322d52: hlt    
544   0x0000000003322d53: hlt    
545   0x0000000003322d54: hlt    
546   0x0000000003322d55: hlt    
547   0x0000000003322d56: hlt    
548   0x0000000003322d57: hlt    
549   0x0000000003322d58: hlt    
550   0x0000000003322d59: hlt    
551   0x0000000003322d5a: hlt    
552   0x0000000003322d5b: hlt    
553   0x0000000003322d5c: hlt    
554   0x0000000003322d5d: hlt    
555   0x0000000003322d5e: hlt    
556   0x0000000003322d5f: hlt    
557 [Exception Handler]
558 [Stub Code]
559   0x0000000003322d60: jmpq   0x000000000328e020  ;   {no_reloc}
560 [Deopt Handler Code]
561   0x0000000003322d65: callq  0x0000000003322d6a
562   0x0000000003322d6a: subq   $0x5,(%rsp)
563   0x0000000003322d6f: jmpq   0x0000000003267600  ;   {runtime_call}
564   0x0000000003322d74: hlt    
565   0x0000000003322d75: hlt    
566   0x0000000003322d76: hlt    
567   0x0000000003322d77: hlt    
568 [ get inner lock ] success
569 [ notifyAll ] ... ...
汇编指令

通过汇编指令发现如下内容:

 

 

    

 

posted @ 2020-08-31 13:04  OutPointException  阅读(240)  评论(0)    收藏  举报