垃圾回收與即時編譯(JIT)

Java 程式碼最佳化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

垃圾回收:基本概念

手動記憶體管理(C/C++)

  • 程式設計師需自行配置與釋放記憶體
  • 容易發生洩漏

$$

Java 的垃圾回收

  • 自動配置記憶體
  • 自動偵測未使用物件
  • 自動回收記憶體
Java 程式碼最佳化

垃圾回收如何運作

  • 標記:從根節點找出可達物件
  • 清除:移除不可達物件

Screenshot 2025-05-11 at 6.58.38 PM.png

Java 程式碼最佳化

垃圾回收與效能

GC 成效權衡

  • 簡化開發,但需考量效能

$$

GC 演算法

  • 現代 JVM 提供多種垃圾回收演算法
  • 選擇取決於應用需求
  • 深入指南見 此處
1 https://www.baeldung.com/jvm-garbage-collectors
Java 程式碼最佳化

GC 的效能影響

// 不佳:建立大量短命物件
for (int i = 0; i < 1000000; i++) {
    new Object(); // 立刻成為垃圾
}


// 對照:重複使用物件 Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // 只有一個參考 }
Java 程式碼最佳化

對 GC 友善的寫法

// 在效能關鍵路徑避免這樣寫
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // 每次都會建立新字串
}


// 更好的作法 StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // 重複使用同一個緩衝區 } String result = builder.toString();
Java 程式碼最佳化

即時編譯(JIT)

  • JVM 執行流程:
    • Java 原始碼 -> 位元組碼(Bytecode)
    • 位元組碼 -> 直譯執行
    • 熱點方法 -> 原生機器碼
  • 最佳化高頻執行的程式碼
Java 程式碼最佳化

對 JIT 友善的模式

  • 撰寫可預期的程式碼
// 可預期的分支有助於 JIT 最佳化
if (value > 0) {
    // 程式碼 A - 常走的路徑
} else {
    // 程式碼 B - 少走的路徑
}
  • 建立聚焦且小型的方法
  • 小而常呼叫的方法適合內聯
  • 複雜程式碼的最佳化效果較差
Java 程式碼最佳化

重點整理

  • 在效能關鍵路徑盡量少建立物件
  • 撰寫符合 JIT 最佳化特性的可預期程式碼
  • 先做剖析,再把最佳化聚焦在關鍵程式碼
Java 程式碼最佳化

一起來練習吧!

Java 程式碼最佳化

Preparing Video For Download...