假設我有以下課程:public class MyClass { public void doSomething() { System.out.println("doing something."); }}讓我們進一步假設,我的項目所做的就是調用該.something()方法。沒有壓倒一切或任何其他有趣的事情發生。MyClass myObj = new MyClass();myObj.doSomething();編譯器是否javac注意到此方法調用未被覆蓋,并將綁定優化為“早期綁定”?我是出于好奇才問的;在任何實際應用程序中,我當然會在我的代碼中散布final、static和private。
1 回答

炎炎設計
TA貢獻1808條經驗 獲得超4個贊
字節碼編譯器(如javac
)通常不會對實例方法調用進行早期綁定:
單獨編譯類的 Java 模型意味著這種優化只能在類調用其方法之一時應用。(如果
javac
假設跨類進行早期綁定,更改和重新編譯一個類可能會導致綁定不正確。)沒有太多價值,因為 JIT 編譯器(或 AOT 編譯器生成器)是執行大多數優化的地方。
現代 JVM 中的 JIT 編譯器根據已加載的完整類集(到目前為止)進行廣泛的優化。這包括優化方法調度和內聯方法調用。此外,JIT 編譯器足夠智能,可以跟蹤關鍵優化,并在動態加載新類等導致先前優化無效時重新編譯。
添加回答
舉報
0/150
提交
取消