垃圾回收算法简单介绍——JVM读书笔记lt;二gt;
垃圾回收的過程主要包含兩部分:找出已死去的對象、移除已死去的對象。
確定哪些對象存活有兩種方式:引用計數算法、可達性分析算法。
方案一:引用計數算法
給對象中加入一個引用計數器。每當有一個地方引用它時。計數器值加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版)》
轉載于:https://www.cnblogs.com/zfyouxi/p/5207896.html
總結
以上是生活随笔為你收集整理的垃圾回收算法简单介绍——JVM读书笔记lt;二gt;的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第九章 Redis过期策略
- 下一篇: block的用法以及block和dele