承接上一篇《JVM-String比較-字節碼分析》,本文將通過圖解方式展示方法內部字節碼的逐步執行過程。
public static void bb() {
String s1 = "a" + "b";
String s2 = "ab";
p(s1 == s2); // true
}
public static void bb();
flags: ACC_PUBLIC, ACC_STATIC
Code: stack=2, locals=2, args_size=0
0: ldc #5 // String "ab" 推送至棧頂
2: astore_0 // 存入第1個局部變量
3: ldc #5 // String "ab" 推送至棧頂
5: astore_1 // 存入第2個局部變量
6: aload_0 // 載入第1個局部變量
7: aload_1 // 載入第2個局部變量
8: if_acmpne 15 // 比較引用,不同則跳轉
11: iconst_1 // 壓入 int 1 (true)
12: goto 16 // 無條件跳轉
15: iconst_0 // 壓入 int 0 (false)
16: invokestatic #10 // Boolean.valueOf(Z)Ljava/lang/Boolean;
19: invokestatic #11 // p(Ljava/lang/Object;)V
22: return
從 Code 首行可知:操作數棧深度=2,局部變量表=2 Slot,參數數量=0。
以下圖片按字節碼偏移量順序展示棧、局部變量、程序計數器變化(若把所有圖片連續查看會有動態效果):


歡迎指正不準確之處,若認同請推薦支持。