垃圾回收相关算法
分类:
文章
•
2022-11-01 00:23:23
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、增量收集算法、分区算法