Java 垃圾收集(GC)機制透過追蹤堆內存中的物件引用關係,識別存活物件與垃圾物件,自動回收不再被引用的記憶體空間。此機制有效避免兩大風險:記憶體耗盡與非法記憶體引用。GC 演算法選擇與參數調優直接影響系統效能,開發者需深入理解。
Minor GC 頻率高但耗時極短,影響較小;Major GC 影響顯著,主要由兩條件觸發:
GC 執行於最低優先級執行緒。當無應用執行緒運行時,GC 會被喚醒。但以下情況除外:
應用執行緒建立新物件時若記憶體不足,JVM 強制觸發 GC。若一次 GC 後仍不足,JVM 再嘗試兩次;若仍無法滿足,拋出 OutOfMemoryError,應用終止。
Major GC 具不確定性,長期運行應用會反覆觸發。
此方法僅為建議,非強制。頻繁呼叫會增加 Major GC 頻率,導致間歇性停頓。驗證方式:在 finalize() 中觀察是否每次皆被呼叫——並非如此。
方法結束後的臨時物件即成為垃圾。減少臨時變數使用,可延緩記憶體不足觸發 Major GC 的時間點。
null 參考物件易被 GC 識別回收,提高辨識效率。
String 不可變,Str1+Str2+Str3 會產生多個中間物件。StringBuffer 可變,原地擴增,避免垃圾產生。
int、long 佔用記憶體遠小於 Integer、Long 物件。無特殊需求(如泛型、集合)時,優先用基本型別。
靜態變數屬全域,生命週期隨應用,不會被 GC 回收,長期佔用記憶體。
短時間大量建立大物件會導致記憶體突增,強制 Major GC;集中刪除同理。平滑分配可降低 GC 壓力。
每個物件維護一個計數器。引用+1,失效-1,歸零即可回收。
優點:執行快,交織於程式運行中,適合即時環境。
缺點:無法檢測循環引用(A→B,B→A),且每次引用變更需額外開銷。
從 GC Roots(根物件集合)出發,遍歷引用圖,標記可達物件為存活,不可達者為垃圾。
JVM 清除階段需包含物件終結化(finalization)。
理解 GC 核心機制、觸發條件與優化策略,能幫助開發者編寫高效能、低延遲的 Java 應用。實務上應結合 JVM 參數調優(如 -Xms、-Xmx、-XX:+UseG1GC 等)與程式碼層面優化雙管齊下。