Java中的Reference分别有四种:FinalReference、SoftReference、WeakReference、PhantomReference,强、弱、软、虚四种;其中只有FinalReference强引用是包内可见的,其他的都是public可以直接在程序中调用的。
一、FinalReference 强引用
强引用是最常使用的引用。
强引用具有的特性:可以直接访问对象、创建的对象不能被GC也就是JVM的垃圾回收器回收、会导致内存泄露报OOM异常。
伪代码:
String str = new String("I am Final Reference !");
二、SoftReference 软引用
软引用是用于描述一些有用但非必需的引用。
软引用的特点:它的实例保存一个Java对象的软引用,该软引用的存在不影响垃圾回收线程对该Java对象的回收。
弱引用的作用:用于对内存敏感的高速缓存。当堆内存未接近阈值使,它不会被垃圾回收器标记并回收,只有当堆内存接近阈值时才会被垃圾回收器去标记并清除。
软引用伪代码:
Object obj = new Object();
SoftReference<Object> sf = new SoftReference(obj);
obj = null;
sf.get(); //被垃圾回收器清除后返回,或者说 根据实际情况返回(内存是否足够,足够则不被GC标记清除则不返回,反之)
sf是对Obj的一个软引用,通过sf.get()方法可以获取到这个对象,当这个对象被垃圾回收器标记并清除后,返回null
三:WeakReference 弱引用
弱引用是来描述非必须的引用。它与软引用的区别:弱引用的生命周期比软引用更短。
弱引用的作用主要是监控对象是否已经被垃圾回收器标记为将回收的垃圾,用弱引的isEnQueued方法返回对象是否被垃圾回收器回收的情况,若被弱引用关联的对象被垃圾回收器回收,则弱引用也会被一起清除,并放进同一个引用队列。
被弱引用管理的对象只能存活到下一次垃圾收集发生之前;当进行垃圾回收时不论内存是否即将溢出都会将弱引用回收。
弱引用伪代码:
Object obj = new Object();
WeakReferernce wf = new WeakReference(obj);
ojb = null;
wf.get;//根据实际情况返回
wf.isEnQueued();//返回监控的对象是否被垃圾回收器标记为即将回收的垃圾
四、PhantomReference 虚引用
虚引用是最弱的一种引用关系。
用虚引用无法通过get 方法获取一个对象的实例;
一个对象是否有虚引用都不会影响它的生命周期。设置虚引用的目的在于垃圾回首时收到一个系统通知
虚引用伪代码:
Object obj = new Object();
PhantomReference pr = new PhantomReference();
obj = null;
pr.get();//永远返回null
pr.isEnQueued();//返回是否从内存中删除
虚引用与软引用和弱引用的一个区别在于:
虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。
(/回答:常用有用但非必需非必需最弱、作用说明、补充说明/)
来源:oschina
链接:https://my.oschina.net/u/4432600/blog/4306184