垃圾回收算法簡介——JVM讀書筆記

垃圾回收的過程主要包括兩部分:找出已死去的對象、移除已死去的對象。

確定哪些對象存活有兩種方式:引用計數算法、可達性分析算法。

方案一:引用計數算法

給對象中添加一個引用計數器,每當有一個地方引用它時,計數器值加1;當引用失效時,計數器值減1;計數器的值爲0時即表明對象已經死去(可被回收)。

優點:實現簡單,判定效率高。

缺點:難解決對象之間互相引用的問題。

如:對象objA和objB都有字段instance,令objA.instance=objB,objB.instance=objA;除此之外,objA和objB再無其他引用,理論上objA和objB可以被回收(無法被訪問),但因爲計數器變爲0,所以導致內存泄露。

方案二:可達性分析算法

通過“GC Roots”對象作爲起始點,從這些節點開始向下搜索,被搜索到的對象marked,堆中未被maked的對象表明不可達(可被回收)。

在Java語言中,課作爲GC Roots的對象包括如下四種:

1.虛擬機棧(棧幀中的本地變量表)中引用的對象

2.方法區中類靜態屬性引用的對象

3.方法區中常量引用的對象

4.本地方法棧中JNI(即一般說的Native方法)引用的對象


垃圾收集算法:

1.標記-清除(Mark-Sweep):用上面描述的方法標記出需要回收的對象,標記後統一回收所有被標記的對象。

2. 複製算法: 爲了解決上述算法清除造成可用空間碎片化的問題,複製算法將內存空間分成大小相等的兩部分,當一部分使用完時,將存活的對象移至另一部分。

3. 標記-整理(Mark-Compact):上述算法造成實際使用空間只佔了分配空間的一半,標記-整理算法在標記後,將所有存活對象向一端移動,然後直接清理掉端邊界以外的內存。

4.分代收集算法:研究表明新生代中的對象98%是“朝生夕死”的,所以將對象添加年齡屬性,根據不同的年齡決定對象存放位置。具體可參考Java垃圾回收


說明:本文的內容參考書籍《深入理解Java虛擬機(第2版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章