【垃圾回收算法與實現讀書筆記】引用計數法 延遲引用計數法 Sticky引用計數法

1. 引用計數算法

引用計數法中引入了一個概念,那就是“計數器”。計數器表示的是對象的人氣指數,
也就是有多少程序引用了這個對象(被引用數)。計數器是無符號的整數,用於計數器的位數根據算法和實現而有所不同。
在這裏插入圖片描述

被引用的對象不僅自己計數器要加1,其自己包含的引用的對象的計數器也要加1。

2.延遲引用計數法

引用計數法的缺點就是計數器值的增減處理繁重。
這裏就引入了延遲引用計數法,延遲就是先不計數,等時機到了再計數。
引入一個 ZCT(Zero Count Table)表,來引用那些引用爲0的對象。
被ZCT引用的對象可能不是垃圾。
當ZCT滿時就遍歷ZCT引用的對象,開始計算每一個對象被引用的值,計算完後回收那些引用依然爲0的對象,剩下的就是有用的對象,再把它們的引用值清零。

3.Sticky引用計數法

該方法主要是覺得計數器的值用int類型有點浪費,推薦使用位數少的的數據類型來存儲。書上是這樣說的:

計數器需要 1 個字(32 位機器就是 32 位)的空間。但是這樣會大量消耗內存空間。
對此我們有個方法,那就是用來減少計數器位寬的“Sticky 引用計數法”。舉個例子,我們假設用於計數器的位數爲 5 位,那麼這種計數器最多隻能數到 2 的 5 次方減 1,也就是 31個引用數。如果此對象被大於 31 個對象引用,那麼計數器就會溢出。這跟車輛速度計的指針爆表是一個狀況。
針對計數器溢出(也就是爆表的對象),需要暫停對計數器的管理。對付這種對象,我們主要有兩種方法。

兩種方法是:

  1. 什麼都不做
    在快要溢出時,不再增加引用值,避免溢出。因爲這樣的概率太小,絕大多數對象的引用值不會超過1。
  2. 採用標記-清除法輔助。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章