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

JVM 記憶體管理:五分鐘徹底搞懂標記-清除演算法

     編輯:Java 相關知識

背景:從根搜尋到垃圾收集

根搜尋算法解決了「哪些物件可回收」的問題,但實際回收仍需 GC 執行緒與應用執行緒協作。標記-清除演算法應運而生:當堆可用記憶體耗盡,觸發 Stop-the-World,執行「標記」與「清除」兩階段。

兩大核心階段

  1. 標記:從 GC Roots 出發遍歷,將所有可達物件標記為存活。
  2. 清除:掃描整個堆,回收未被標記的物件佔用的記憶體。

圖解流程

GC 前物件狀態

標記階段完成

清除階段完成

清除後,存活物件標記位歸零,程式恢復運行。

為何必須 Stop-the-World?

若 GC 與應用並發,可能出現「漏標」導致新建物件被誤回收。例如:物件 A 已標記完成,此時應用建立 B 並讓 A 引用 B,B 錯過標記階段,清除時將被錯誤回收,導致程式邏輯錯誤。

兩大致命缺點

  1. 效率低:遞歸遍歷根節點 + 全堆掃描,且需暫停應用,交互式系統體驗極差。
  2. 記憶體碎片:清除後空閒區間不連續,需維護空閒列表,大物件(如陣列)分配困難。

結語

標記-清除是 GC 歷史的起點,其缺點直接催生了複製與標記-整理兩大優化演算法。下一章將詳細拆解這兩種改良方案。

作者:zuoxiaolong(左潇龍)
出處:博客園左潇龍的技術博客

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