标记-清除算法
GC标记-压缩算法由标记阶段和清除阶段构成
我们在详解gc(垃圾回收)机制(一) 简单说明了 标记-清除算法
gc步骤:
1:暂停程序业务逻辑,对所有对象进行标记分类
2:找出程序可达对象和不可达对象
3:删除不可达对象
标记清除算法就是如此简单明了,不会出现循环引用的问题,
但是标记清除算法需要暂停程序,会造成程序卡顿
同时每次标记都需要扫描整个堆内存空间
步骤一:遍历根引用的对象:
步骤二:将已经引用的对象打上标记
步骤三:遍历引用对象的子对象,继续打上标记
步骤四:遍历整个堆,将堆上没有标记的对象清除:
优点
1:算法简单
缺点
1:碎片化
可以看出,在gc之后,每个空闲的堆空间都是不连续的,大大小小,在之后分配内存可能会出现大内存对象无法分配到有效堆空间的问题
2:分配速度慢
因为内存分块不是连续的,所以每次分配新的内存,都需要遍历整个空闲链表,找到适合内存对象的内存块
3:与写时复制技术不兼容
因为在gc标记阶段时,也会改动所有的活动对象的标记,导致触发了"写时复制",从而变成了不管有没有重写对象,都会触发写时复制.
该缺点可以通过一个新的活动对象(位图结构),将活动对象对应上,在标记时,只在新活动对象改动,而不改动活动对象