标记清除法的算法如下图所示:
实现简单
与保守式GC算法相兼容(由于保守式GC算法中,对象是不能被移动的。所以,适用于标记-清除算法。)
内存空间碎片化
由于分块不是连续的,因此每次分配都必须遍历空闲链表,找到足够大的分块。
如果分配的是大的对象,最糟的情况就是得把空闲链表遍历到最后。
标记和清除过程的效率都不高。
它是最基础的GC算法,后续的GC算法都是针对它的缺点进行改良而产生的。JVM回收器中的CMS就是使用的该算法
简单来说,保守式 GC(Conservative GC)指的是“不能识别指针和非指针的GC”。
【优点】
①语言处理程序不依赖于GC
保守式GC的优点在于容易编写语言处理程序。处理程序基本上不用在意GC就可以编写代码。语言处理程序的实现者即使没有意识到GC的存在,程序也会自己回收垃圾。因此语言处理程序的实现要比准确式GC简单。
【缺点】
①识别指针和非指针需要付出成本
②错误识别指针会压迫堆。
当存在貌似指针的非指针时,保守式GC会把被引用的对象错误识别为活动对象。如果这个对象存在大量的子对象,那么它们一律都会被看成活动对象。因为程序把已经死了的非活动对象看成了活动对象,所以垃圾对象会严重压迫堆。
③能够使用的GC算法有限。