引用计数法
在对象被引用的情况下 引用计数+1,解除引用-1.当引用计数为0时,释放该对象。这个会出现循环引用的问题。
双色标记法
传统的双色标记法,即对象的颜色非黑即白。新创建的对象为白色。gc流程的伪代码
每个新创建的对象为白色
//标记阶段
对整个root关联的集合进行遍历
取出一个对象,标记为黑色
遍历对象多关联的其他所有对象
标记为黑色
//回收阶段
遍历系统中所有的对象
如果为白色
这些对象没有被引用的对象,逐个回收(无法通过root节点访问到)
如果为黑色
这些对象就是被引用的对象,重新标记成白色(为下一轮循环做准备)
双色标记法,必须以stop the world的方式运行。在垃圾回收过程中,新产生一个对象。
- 如果标记成白色,那么在回收阶段没有遍历过这个对象就已经被回收了
- 如果标记成黑色,那么在回收阶段没有遍历过这个对象就不会被回收(要等到一轮gc了)。
扫描标记法之所以不会出现循环引用的情况,我们看到图中对象2和对象4是循环引用的,但是一旦对象2不能被root set访问到,对象2和对象4甚至对象1和对象3都会在清除阶段被回收。
标记清除法,还有个负作用就是,会产生内存碎片。