文章目录
java1.2之后,对引用进行了扩充,分别为强软弱虚。强度依次减弱。
强引用(StrongReference)
最传统的引用定义。无论在任何情况下,只要强引用的关系还存在,垃圾收集器就永远不会回收掉被引用的对象。
使用:
Object ob = new Object();
只有当ob = null
时,及没有指针指向Object对象时,Object对象才有可能被垃圾回收器回收。
软引用(SoftReference)
在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出OOM异常。
内存不足即回收
软引用通常来实现内存敏感的缓存。如:高速缓存。如果还要空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存。
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<>(obj);
obj = null;//将强引用销毁
弱引用(WeakReference)
当垃圾收集器工作时,无论空间是否足够,都会回收掉弱引用关联的对象。只被弱引用关联的对象只能生存到下一次垃圾收集发生为止。
发现即回收
Object obj = new Object();
WeakReferebce<Object> wr = new WeakReference<>(obj);
obj = null;//将强引用销毁
虚引用(PhantomReference)
一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
虚引用可以跟踪对象的回收时间,因此可以将一些资源释放操作放置在虚引用中记录和执行。
Object obj = new Object();
//引用队列,当虚引用被回收时,会被放入引用队列
ReferenceQueue phantomQueue = new ReferenceQueue();
PhantomReference<Object> pf = new PhantomReference<>(obj,phantomQueue);
//将强引用销毁
obj = null;
* 终结器引用(FinalReference)
用于实现对象的finalize()方法,也可以成为终结器引用。
无需手动编码,内部配合引用队列使用。
在GC时,终结器引用入队。由Finalizer线程通过终结器引用找到被引用对象,并调用它的finalize()方法,第二次GC时才能回收被引用对象