本文從 Java 虛擬機架構、分代垃圾回收、JVM 參數調優、易忽視的編程原則、Profiler 工具五個維度,系統闡述 Java 應用效能優化的核心知識體系。

| 演算法 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| 複製 | 空間劃二,活躍物件複製到另一半,整塊回收 | 只訪問活躍物件,回收快 | 需雙倍空間,複製成本高 |
| 標記-清除 | 標記活躍,掃描全區回收未標記 | 無額外空間 | 停頓長、碎片多、掃描慢 |
| 標記-清除-整理 | 標記後將活躍物件移動合併 | 綜合優點 | 移動成本 |
GC 類型:Minor GC(新生代,頻繁快速)vs Major GC(全堆,低頻長停頓)。多 CPU 環境下可並發 GC 減少停頓。
| 參數 | 含義 | 策略選項 |
|---|---|---|
| -Xgcpolicy | GC 策略 | optthruput(吞吐優先/默認) | optavgpause(停頓優化) | gencon(分代並發) | subpool(多核子池) |
| -Xms / -Xmx | 堆初始/最大值 | 建議設相同,避免動態擴縮 |
| -Xmn | 新生代大小 | 根據物件存活率調整 |
| -Xss | 棧大小 | 默認 256K,建議優化代碼減少深度而非調大 |
// 差:pop 後引用殘留,阻礙 GC
public Object pop1() { return stk[stkp--]; }
// 好:pop 前置空,斷開引用鏈
public Object pop2() {
Object p = stk[stkp];
stk[stkp--] = null;
return p;
}
public class ObjectFactory {
private static Map pool = new HashMap<>();
public static synchronized Object generate(String className) { ... }
public static synchronized void drop(Object obj) { ... }
}
bin/jconsole工具輔助分析物件分配、堆狀態、線程死鎖、網絡狀態,但根本在於開發者理解 JVM 機制、遵循優化原則。