垃圾回收相关算法

1、标记阶段:引用计数算法

1.1、垃圾标记阶段:对象存活判断

  • 在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。
  • 那么在JVM中究竟是如何标记-一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。
  • 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。

1.2引用计数算法

  • 引用计数算法(Reference Counting) 比较简单,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。|
  • 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收
    优点:
    实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。
    缺点:
    1、它需要单独的字段存储计数器,这样的做法增加了存储空间的开销。
    2、每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销。
    3、引用计数器有一个严重的问题,即无法处理循环引用的情况。这是一条致命缺陷,导致在Java的垃圾回收器中没有使用这类算法。

垃圾回收相关算法

2、标记阶段:可达性分析算法

3、对象的finalization机制

4、MAT与JProfiler的GC Roots溯源

5、清除阶段:标记清除算法

6、清除阶段:复制算法

7、清除阶段:标记-压缩算法

8、小结

9、分代收集算法

10、增量收集算法、分区算法