过程:给对象添加一个引用计数器,每当被引用时,计数器值加一;引用失效时,值减一。当计数器值为0时,该对象就不会再被使用。
缺陷:虽然实现起来简单,并且效率也较高,但是**很难解决对象间相互引用的问题。**因此主流Java虚拟机不选用引用计数算法来管理内存。
Java虚拟机中的垃圾回收器采用可达性分析来探索存活的对象
GC Roots
对象为起点的引用链**上是否有该对象,如果没有,说明该对象可以被回收1.强引用 2.软引用 3.弱引用 4.虚引用 5.终结器引用
代码中普遍存在(最常见)的引用方式。
特点:被强引用关联的对象不会被回收
Object obj = new Object()
特点:被软引用关联的对象只有在内存不够的情况下才会被回收。
使用 SoftReference
类来创建软引用。
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null; // 使对象只被软引用关联
特点:被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾回收发生之前。
使用WeakReference
类来实现弱引用。
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
又称为幽灵引用或者幻影引用。
特点:一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象。
为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知。
使用PhantomReference
类来实现虚引用。
Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj = null;