首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JVM 調優總結(四):垃圾回收面臨的三大核心問題

     編輯:Java 相關知識

問題一:如何區分垃圾?

引用計數法(已廢棄)

對象頭記錄引用計數,引用+1,釋放-1,計數為 0 即垃圾。**致命缺陷:無法處理循環引用**(A→B, B→A,計數永不為 0)。

可達性分析算法(主流)

從 **GC Roots** 出發,沿引用鏈遍歷,**可達對象 = 存活,不可達 = 垃圾**。

GC Roots 可達性分析

GC Roots 包含:

  1. **虛擬機棧**中引用的對象(局部變量表)。
  2. **方法區**中類靜態屬性/常量引用的對象。
  3. **本地方法棧** (JNI) 引用的對象。
  4. **同步鎖** 持有的對象。
  5. **活躍線程** 對象本身。

本質是 **標記-清除** 思想的起點:以棧幀為根構建對象樹,樹上對象存活,其餘可回收。

問題二:如何處理內存碎片?

對象大小不一、生命週期不同 → 回收後留下不連續空閒塊 = **碎片**。

算法碎片處理缺點
標記-清除不處理,產生大量碎片大對象分配困難
複製將存活對象復制到新區,**天然無碎片**浪費 50% 空間
標記-整理標記後將存活對象**向一端移動**,更新引用移動開銷大,需 STW

**新生代用複製**(存活少、效率高)、**老年代用標記-整理/並發標記-清除+定期壓縮**。

問題三:對象創建與回收的並發矛盾

  • **應用線程** = 內存分配器(不斷 new Object)。
  • **GC 線程** = 內存回收器(不斷回收垃圾)。
  • **矛盾**:一邊分、一邊收,若不暫停應用,引用關係瞬息萬變,無法構建一致的對象圖。

Stop-The-World (STW) 方案

**暫停所有應用線程** → GC 獨佔堆 → 掃描/回收 → 恢復應用。
**優點**:實現簡單、結果準確。
**缺點**:**堆越大、停頓越長** → 大堆 (>4GB) 停頓達秒級,違背實時性。

並發/增量 GC 方案

  • GC 線程與應用線程**並發運行**(CMS、G1、ZGC、Shenandoah)。
  • **挑戰**:
    1. **三色標記** + **寫屏障** 維護並發一致性。
    2. **浮動垃圾** 預留空間。
    3. **碎片難整理**(CMS 痛點)。
    4. 算法複雜度指數級上升,吞吐量下降。

總結

GC 核心三問 —— **識別垃圾 (可達性)、清理碎片 (複製/整理)、協調並發 (STW vs 並發)** —— 貫穿從 Serial 到 ZGC 的所有演進。理解這三個問題的權衡,是調優與架構選型的指南針。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved