Java 編譯器與 JIT 編譯器為了效能會對指令進行重排序,但在 Eclipse(或 IntelliJ IDEA、VS Code 等)的 Debug 模式下,程式碼卻嚴格按源碼順序逐行執行。這背後的機制其實很簡單:
-g 參數(生成行號、局部變數表等除錯資訊),且不啟用 -O 優化選項。LineNumberTable、LocalVariableTable 等除錯屬性,且方法未被標記為 Compiled(或被標記為 !Optimized),解譯器/客戶端編譯器會跳過指令重排序、內聯、逃逸分析等激進優化。IntelliJ IDEA、NetBeans、VS Code (Java Extension) 等皆採用相同策略:Debug 模式 = 無優化編譯 + 完整除錯資訊。這不是 Eclipse 獨有,而是 JVM 除錯架構(JDWP/JDI)的標準需求。
-ea),Release 通常關閉,導致行為差異。javac -O / maven profile=release 完整建置並測試。launch configuration → Arguments → VM arguments 加入 -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation -XX:LogFile=jit.log。JITWatch 分析編譯後的組合語言,查看指令排程。jcstress 並發測試,在 Release 模式下驗證記憶體可見性問題。總結:Debug 模式為了「可除錯」犧牲了「優化」,這是所有主流 Java IDE 的共同設計決策。理解這一點,能避免在除錯時對執行順序產生錯誤預期。