GC算法-引用计数法
概述
引用計數法又是什么鬼呢? 顧名思義, 對對象的引用進行計數. 通過記錄每個對象被引用的次數, 來確定這個對象是否可以被回收.
實現
首先, 對對象的引用數量進行管理, 什么時候會更新呢?
這次就不上代碼了, 簡單介紹一下思路就行. (我哥說代碼看著費勁)
前提: 我們有一個全局的空閑地址鏈表: FREE_HEAD
創建對象的操作
更新指針的操作
實現說起來簡簡單單, 畢竟我也不用真的去實現, 簡單想一下.
分析
在上一次的標記清除算法中, GC在每次內存不足時運行, 勢必會導致程序暫停時間比較長. 但引用計數則在每次指針變更的同時進行管理, 在產生新的垃圾的時候立刻進行回收. 這就體現出它的幾個優勢了:
當然, 只說優勢不說劣勢都是扯犢子. 首先, 引用計數的優勢也會成為它的劣勢, 計數頻繁的計算, 會拖累程序的速度. 而且每個對象都要開拓空間來保存引用數量. 當然了, 還有經常被說到的循環引用的問題. 等等吧.
當然, 針對問題, 偉大的前人總是有辦法去解決. 比如:
延遲計數法: 針對頻繁更新計數器的問題而提出的. 大概意思就是不去實時的對引用數量進行更新, 將引用數量為0的記錄到一個待處理的鏈表中, 當需要新的內存時再統一處理. 但是這樣又會增大暫停時間, 才不要.
Sticky引用計數法: 引用計數通過額外的空間保存引用數量, 但這個必然會有最大值, 比如用1個字節, 則引用數量超過256的就記不下了. 這個方法對超出范圍的處理方式很簡單, 什么都不做, 不去回收, 畢竟被引用這么多次, 該對象定然很重要. 那這些對象不就永遠都不能被回收了么? 可以, 等到沒有內存了, 使用標記清除算法將所有對象過一遍.
當然, 針對引用計數法還有很多演變, 有些還是很有意思的, 有些是我看不懂的.
垃圾回收的整體思路分兩個流派(我所知道的):
引用計數的最大優勢應該就是不需要暫停程序去進行回收了, 隨使用隨回收. 但劣勢也很明顯: 需要計數器額外空間以及循環引用的問題.
個人是比較喜歡引用計數的, 實時性又高, 又不需要太多的額外空間. 只是需要在編寫代碼的時候刻意規避循環引用, 或者其他方法規避一下? 甚至不去處理都刻意, 如果只有少數的話(如果有很多, 還是換個算法吧).
總結
以上是生活随笔為你收集整理的GC算法-引用计数法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 活在幻梦中的你我
- 下一篇: NS2相关学习——创建Xgraph的输出