GC-標記清除算法

自己的思維提綱和讀書筆記,不詳細,推薦自己讀GC相關(guān)的書

標記階段

  • 標記根直接引用的對象(遞歸),避免重復(fù)標記
  • 思想:遍歷對象并標記
  • DFS,容易壓低內(nèi)存使用

清除階段

  • 遍歷對象并回收
  • 取消活動對象標記,回收非活動對象
  • 所費時間和堆大小成正比

分配

  • first fit(比較好用)
  • best fit
  • worst fit

合并

優(yōu)缺點

  • 優(yōu)點
    • 實現(xiàn)簡單
    • 與保守式GC算法兼容(對象不能被移動)
  • 缺點
    • 碎片化
    • 分配速度(分塊不連續(xù),最壞遍歷整個free_list)【BiBOP技術(shù)】
    • 不兼容COW技術(shù)(算法機制導(dǎo)致的頻繁設(shè)置標志位,以致不必要的復(fù)制) 【bitmap】

注:COW技術(shù)重寫時復(fù)制私有空間數(shù)據(jù),復(fù)制后不再訪問共享空間

多個空閑鏈表

  • 改進分配速度
  • 思路:創(chuàng)建只鏈接大分塊和只鏈接小分塊的空閑鏈表
  • 實現(xiàn)注意:設(shè)定上限,大分塊需求極為罕見,不必太在意大分塊分配效率,著重考慮小分塊
  • 算法部分:添加尋找鏈表序號的部分

BiBOP(Big Bag of Page)

  • 把堆分成固定大小的塊,讓每塊只能配置同樣大小的對象(比如某一空閑鏈表均配置2個字大小的塊)
  • 作用:提高內(nèi)存使用效率
  • 這種方法不能完全消除碎片化,可能會有多個分塊中都會有相同大小的碎片(比如兩個字大小的內(nèi)存塊中)

位圖標記(Bitmap)

  • 只收集標志位并利用位圖管理管理(不涉及對象,修改時只修改位圖中的標志位)
  • bitmap可用數(shù)組、散列、樹等實現(xiàn),一般一個字分配一個位
  • 一般需要obj_num(序號),index(行號),offset(列號)
  • 優(yōu)點
    1. 與COW技術(shù)兼容
    2. 清除操作更高效
      同樣遍歷堆,同時遍歷bitmap,將所有非活動對象回收至free_list之后,將bitmap每位均置0,以達到清除活動對象標志位的效果(沒有立即消除標志位)
  • Note
    此方法利用位運算計算對象對應(yīng)的標志位,對象地址不連續(xù)時,單純的位運算無法計算對象標志位的位置。因此有多個堆時,一般為每個堆準備一個bitmap。

延遲清除

  • 縮減因清除操作而導(dǎo)致的mutator最大暫停時間
  • 分配
    利用清除(lazy_sweep)操作分配,成功即返回,否則執(zhí)行一次mark_phase()做標記,繼續(xù)調(diào)用lazy_sweep()分配
  • lazy_sweep()
    1. 遍歷的開始位置位于上一次清除操作中發(fā)現(xiàn)分塊的右側(cè)($sweeping是全局變量)
    2. 延遲清除不遍歷整個堆,只在分配時執(zhí)行必要的遍歷,壓縮因清除導(dǎo)致的mutator暫停時間
  • Note:如果垃圾變成垃圾堆,活動對象變成活動對象堆,會導(dǎo)致延遲清除效果不均衡。遍歷至垃圾堆部分獲得分塊速度較快,遍歷至活動對象堆分配變慢。

(這部分后續(xù)還會有更詳細的相關(guān)知識)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容