在我的上一篇博客JVM-String比較-字節碼分析中介紹了String字符串比較的原因,借著分析字節碼的機會,我這篇博客將會繪圖展現方法內部字節碼執行過程。
話不多說,貼上我們將要分析的Java方法代碼:
public static void bb(){ String s1="a"+"b"; String s2 = "ab"; p(s1==s2);//true }
再貼上我們將要分析的Java方法的字節碼:
public static void bb(); flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=2, args_size=0
0: ldc #5 // String ab 將字符串"ab"從常量池中推送至棧頂 2: astore_0 將棧頂引用類型(字符串"ab")存入第一個本地變量 3: ldc #5 // String ab 將字符串"ab"從常量池中推送至棧頂 5: astore_1 將棧頂引用類型(字符串"ab")存入第一個本地變量 6: aload_0 將第一個本地變量("ab")推送至棧頂 7: aload_1 將第二個本地變量("ab")推送至棧頂 8: if_acmpne 15 比較棧頂兩引用類型數值,結果不同跳轉(這裡當然相同啦) 11: iconst_1 將int類型 1 推送至棧頂 12: goto 16 無條件跳轉到16字節碼偏移量 15: iconst_0 16: invokestatic #10 // Method java/lang/Boolean.valueO 調用靜態方法Boolean.valueOf();並將返回的Boolean類型的true壓入棧頂 f:(Z)Ljava/lang/Boolean; 19: invokestatic #11 // Method p:(Ljava/lang/Object;)V 調用靜態方法p(true);輸出true 22: return 從當前方法返回void
由Code:下面的第一行,我們得知,操作數棧深度為2,局部變量空間為2個Slot,參數個數為0。
如果你把所有的圖片復制下來,會看到動態般執行的效果。
-------------------------------------------------------------------繪圖分割線----------------------------------------------------------
如果有不對的地方,歡迎指正。
如果你認同我的博文,幫忙推薦一下,博主寫這篇博客不易。