理解 JVM 字節碼指令是深入掌握類加載、方法執行、並發控制等底層機制的基礎。指令由一字節操作碼與零至多字節操作數組成,採用基於棧的指令集架構。本文系統梳理指令特性、類型相關指令、核心指令分類與關鍵執行語義。
(byte1 << 8) | byte2),犧牲少量解析性能換取代碼緊湊性。i(int)、l(long)、f(float)、d(double)、a(reference) 等。局部變量表 ↔ 操作數棧傳輸:
iload, iload_<n>, lload, fload, dload, aload 等istore, istore_<n>, lstore, fstore, dstore, astore 等bipush, sipush, ldc, ldc_w, ldc2_w, aconst_null, iconst_<i>, lconst_<l>, fconst_<f>, dconst_<d>wide對棧頂數值運算,結果壓回棧頂。分整型與浮點型:
iadd/ladd/fadd/dadd, isub/lsub/fsub/dsub, imul/lmul/fmul/dmul, idiv/ldiv/fdiv/ddiv, irem/lrem/frem/dremiincishl/ishr/iushr, iand/ior/ixor 等lcmp, fcmpg/fcmpl, dcmpg/dcmpl浮點運算遵循 IEEE 754:溢出返回無窮大,無定義結果返回 NaN,轉整數採向零截斷模式。
int→long→float→double 等i2b, i2c, i2s, l2i, f2i, d2i, d2l, d2fnew(類實例)、newarray/anewarray/multianewarray(數組)getfield/putfield(實例字段)、getstatic/putstatic(靜態字段)iaload/iastore 等按類型加載/存儲、arraylengthinstanceof, checkcastpop, pop2dup, dup2, dup_x1, dup_x2, dup2_x2swapifeq, iflt, ifne, if_icmpeq, if_acmpne 等tableswitch, lookupswitchgoto, goto_w, jsr, jsr_w, ret| 指令 | 用途 | 分派方式 |
|---|---|---|
invokevirtual | 實例方法 | 動態分派(多態) |
invokeinterface | 接口方法 | 運行時搜索實現類 |
invokespecial | 構造器/私有/父類方法 | 靜態分派 |
invokestatic | 靜態方法 | 靜態分派 |
invokedynamic | 動態語言支持 | 用戶定義引導方法 |