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

JVM 垃圾收集深度解析(一):核心算法與記憶體管理基礎

     編輯:Java 相關知識

對象創建與 GC 職責

Java 透過 new、newarray 等指令創建對象,當不再使用時由 GC 回收。JVM 規範未強制特定 GC 技術,甚至允許無 GC 實現,但必須自動管理記憶體、避免碎片導致 OOM。

GC 兩大核心任務

  1. 檢測垃圾:建立根對象集(局部變量、操作數棧、類常量池、JNI 引用等),從根出發可達即為存活。
  2. 回收空間:釋放不可達對象記憶體,並整理碎片形成連續空閒區。

根對象來源詳解

  • 線程棧幀中的局部變量引用與操作數棧引用。
  • 已加載類的常量池引用(類名、方法名、字符串常量等)。
  • JNI 傳遞且未釋放的對象引用。
  • 方法區中存放於 GC 堆內的類元數據(可實現類卸載)。
  • 保守式 GC 視基本類型為潛在指針,但不處理。

經典垃圾檢測算法

引用計數法

每個對象維護計數器,引用+1,失效-1,歸零即回收。致命缺陷:無法處理循環引用,且增減計數開銷大,現代 JVM 已棄用。

追蹤收集器:標記-清除

從根節點遍歷對象圖,標記所有可達對象;掃描堆,未標記者為垃圾回收。標記可存在對象頭或獨立位圖。

碎片整理策略

壓縮收集

將存活對象向堆一端滑動,形成大塊連續空間。需更新引用,常透過「句柄表」間接寬址:引用指向句柄,句柄指向實體,移動時只改句柄。缺點:每次訪問多一次間接查找。

複製收集

將堆劃為兩半,每次只用一半。滿時暫停,將存活對象複製到另一半,原半區全清空。優點:無碎片、分配極快(指針遞增)。缺點:記憶體利用率僅 50%。

分代收集器

結合複製與標記清除:

  • 新生代:採用複製算法(Eden + 2 Survivor),頻繁收集,存活極少。
  • 老年代:標記-清除/壓縮,收集頻率低。
  • 對象經過多次 GC 存活即晉升老年代。

分代思想可套用於任何基礎算法,核心是「針對不同年齡對象採用不同策略」,大幅提升整體吞吐量與暫停表現。

圖解:停止-複製算法 9 步驟

複製收集過程快照

圖示展示雙半區輪換、存活對象來回複製、垃圾整區清除的動態過程。

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