GC原理
三个步骤:
1. 需要回收的对象?
回收那些不可能再被任何途径使用的对象
1.1.怎样确定哪些对象是不再被引用的对象?(两次标记)
首先:通过可达性分析算法对GC-ROOT对象向下搜索,搜索到的对象到GC-ROOT的路径被称为引用链,如果一个对象没有到达GC-ROOT的引用链,则此对象被标记。
然后: 对已标记的对象进行筛选,筛选的条件是对象是否有必要执行finalized()方法。当对象没有覆盖finalized()方法,或者虚拟机已经调用过此方法,都被视为“没有必要执行”。
最后:若对象被判定为有必要执行finalized()方法,这些对象将被放置在F-Queue队列中,进行第二次标记。此时虚拟机自动创建的Finalizer线程来会出发finalized()方法,若对象在finalized()方法中逃逸,此对象将在第二次标记时被移除“即将回收”的集合,如果还没有逃脱,对象就被回收。
2.什么时候回收?
- 强引用:普遍存在的对象,类似new对象创建,只要强引用存在,垃圾回收器永远不会回收被引用的对象。
- 软引用:还有用但是非必须,在系统发生内存溢出之前之前,会将这部分对象列入回收范围中进行二次回收,若这轮垃圾回收之后内存还是不够用,则抛出内存溢出异常。(JDK1.2)
- 弱引用:非必须对象,被此关联的对象的生命周期只到下次垃圾回收之前,当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象(JDK1.2,WeakReference类)
- 虚引用:不影响对象的生命周期,并且此引用将不会创建对象。只是在垃圾回收后有系统通知。
3.如何回收?
标记-清除算法
复制算法
标记整理算法