哪些对象可以被回收
- 引用计数算法
- 根遍历算法
如何进行回收
- 标记-清除算法
- 复制算法
- 标记-整理算法
引用计数算法:
对象有一个引用+1,删除一个引用-1。只要计数为0的可以被GC。
- 缺点:
- 循环引用问题。如A.b = B和B.a=A。再无其他引用。
- 需要维护一个计数器。
根遍历算法
针对引用计算器算法的循环引用问题,出现了根遍历算法。设若干个GC roots,若一个对象从GC roots到这个对象不可达,则说明该对象不可用。
标记-清除
通过根遍历,标记从根节点开始所有可达对象。未被标记的就是需要垃圾处理的对象。清除时,清除所有未被标记的对象。
复制算法(新生代)
将原有的内存分成两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中存活对象复制到未使用内存块中,之后,清除正在使用的内存块中所有对象。
特点,比标记-清除效率高,但空间浪费
标记-整理(老年代)
对于对象存活率比较高的,使用复制算法,效率变低,且浪费空间。所以出现了标记-整理算法。通过根遍历,将标记的对象放到内存的一段,清理边界外所有空间。
标记整理不是对象保存连续了,不至于内存中的对象杂乱无章,也消除了复制算法中内存问题。但是标记整理的效率不高,对于老年代,由于老年代存活率相对问题,不需要频繁整理,所以标记整理适合老年代。