JVM 屏蔽了絕大多數平台差異,但規篞未強制規定、實現存在 Bug、OS 行為差異三大來源,仍會導致「我在這平台跑得好好的,換台機器就崩」的 Gotcha。
如尾遞歸優化:JVM 規範不要求實現。_factorial(n-1, n*result) 在無優化 JVM 上會棧溢出,有優化則不會。靜態編譯無法安全轉換(會破壞子類覆寫語義),必須依賴 JIT 動態優化。測試代碼 loop(0) 可驗證當前 JIT 是否支持尾調用優化。
Swing 是重災區。JDK 1.4 JOptionPane 在「空行後輸入文本→上鍵→下鍵」序列下凍結,Windows/Solaris/Linux 全中招。升級 JVM 版本可能引入新 Bug,回歸測試必須覆蓋多版本 JVM。
經典案例:FileReader 未關閉直接退出。Unix 允許刪除打開文件,Windows 會拋異常。單元測試在 Unix 通過、Windows 失敗暴露了 Split Cleaner 錯誤。修復:reader.close() 顯式釋放。
跨平台有代價,但遠低於 C/C++。敬畏平台差異,持續測試,是 Java 開發者的必修課。