JVM

07-垃圾收集算法

2021-06-08  本文已影响0人  紫荆秋雪_文

从如何判定对象消亡的角度出发,垃圾收集算法可以划分为 “引用计数式垃圾收集”(Reference Counting GC)和 “追踪式垃圾收集”(Tracing GC)两大类,这两类也常被称作“直接垃圾收集”和“间接垃圾收集”

一、分代收集理论

当前商业虚拟机的垃圾收集器,大多数都遵循了“分带收集”(Generational Collection)的理论进行设计,分代收集名为理论,实质是一套符合大多数程序运行实际情况的经验法则,它建立在两个分代假说之上:弱分代假说和强分代假说

二、标记-清除算法

最早出现也是最基础的垃圾收集算法是 "标记-清除(Mark-Sweep)"算法,在1960年由Lisp之父John McCarthy所提出。如它的名字一样,算法分为 "标记" 和 "清除" 两个阶段:首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程。

1、缺点

三、标记-复制算法

标记-复制算法常被简称为复制算法。为了解决"标记-清除算法"面对大量可回收对象时执行效率低的问题,1969年 Fenichel 提出了一种称为 "半区复制(Semispace Copying)"的垃圾收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。对于大多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要一动堆顶指针,按顺序分配即可。

1、缺点

2、Appel式回收

Appel式回收的具体做法是把新生代分为一块较大的Eden空间和两块较小的Survivor空间,每次分配内存只使用Eden和其中一块Survivor。发生垃圾搜集时,将Eden和Survivor中仍然存活的对象一次性赋值到另外一块Survivor空间上,然后直接清理掉Eden和已用过的那块Survivor空间

四、标记-整理算法

标记-复制算法在对象存活率较高时就哟啊进行较多的复制操作,效率将会降低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

1、缺点

上一篇 下一篇

猜你喜欢

热点阅读