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

JVM 記憶體管理:GC 算法精解——複製與標記整理演算法

     編輯:Java 相關知識

複製演算法

複製演算法將記憶體劃分為大小相等的兩塊:活動區與空閒區。分配時僅使用活動區;當活動區耗盡,暫停程式(Stop-the-World),啟動 GC 執行緒,將存活物件按順序複製至空閒區,並更新引用地址。複製完成後,兩區角色互換,原活動區一次性清空,實現記憶體整理與回收。

複製演算法示意圖

GC 後記憶體佈局

優缺點分析

  • 優點:解決標記-清除的記憶體碎片問題,分配只需指標碰撞,速度極快。
  • 缺點:浪費 50% 記憶體;若物件存活率高(極端 100%),複製開銷巨大,效率驟降。

結論:複製演算法僅適用於存活率極低的場景(如新生代)。

標記-整理演算法

演算法分兩階段:

  1. 標記:同標記-清除,遍歷 GC Roots 標記存活物件。
  2. 整理:將所有存活物件向記憶體一端移動,按順序緊湊排列,清理邊界外記憶體。

GC 前記憶體狀態

標記階段

整理階段後

優缺點分析

  • 優點:無記憶體碎片,記憶體利用率 100%,無需複製空間。
  • 缺點:需移動物件並更新引用,效率低於複製演算法(多了一次整理掃描)。

三大演算法綜合對比

指標複製標記-整理標記-清除
執行效率最高中等最低
記憶體整齊度最好最好差(碎片多)
記憶體利用率50%100%100%

標記-清除雖較落後,但作為基礎孕育了後兩者。實際工程中,沒有完美算法,只有最適合場景的算法——這正是分代收集誕生的動力。

結語

理解三大演算法的權衡,才能看懂為何 JVM 要按物件年齡分代處理。下一章將揭曉「神級算法」——分代收集算法的完整邏輯。

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

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