熱點方法內聯是 JVM 最關鍵的優化手段。未優化時,每次方法調用需建立堆棧幀,涉及參數壓棧、返回地址保存、棧指針調整等開銷。
JVM 運行時自動內聯符合條件的「熱點方法」:
public class InlineMe {
int counter = 0;
public void method1() {
for (int i = 0; i < 1000; i++) addCount();
System.out.println("counter=" + counter);
}
public int addCount() { // 返回 int
counter = counter + 1;
return counter;
}
}
運行 java -Xrunhprof:cpu=times InlineMe,輸出顯示 addCount 獨立出現,未內聯。
public void addCount() { // 無返回值
counter = counter + 1;
}
再次 Profiling,addCount 消失於熱點列表 —— 已被內聯進 method1。
當 JVM 無法內聯(如多態調用、方法過大、含 try-catch)且 Profiling 證實為熱點時,可手動將代碼搬移到調用處,前提是不破壞物件模型與封裝。
| 特性 | 說明 |
|---|---|
| 快速內存分配 | TLAB (Thread Local Allocation Buffer) 無鎖分配 |
| 類文件壓縮 | 共享常量池、屬性表精簡 |
| 改進 GC | 分代、並行、並發、G1/ZGC 低延遲 |
| 內聯 JIT | C1/C2 編譯器分層編譯,熱點原生碼化 |
| 逃逸分析 | 標量替換、棧上分配、鎖消除 |