java对象的引用包括
强引用
软引用
弱引用
虚引用
我们以String为例说明各种引用的创建方式:
1.强引用
是指创建一个对象并把这个对象赋给一个引用变量。
强引用有引用变量指向时永远不会被垃圾回收。即使内存不足的时候。
String str1=new String("强引用");
2.软引用
软引用通过SoftReference类来实现
软引用的对象当系统内存充足时和强引用没有太多区别,但内存不足时会回收软引用的对象。
SoftReference<String> Str2 = new SoftReference<String>(new String("软引用"));
当系统内存充足时,系统不会进行软引用的内存回收,当系统不足时将会回收软引用的对象。
3.弱引用
弱引用通过weakReference类来实现
WeakReference<String> wr = new WeakReference<String> (new String("弱引用"));
弱引用具有很强的不确定性。因为垃圾回收每次都会回收弱引用的对象。
4.虚引用
软引用和弱引用可以单独使用,虚引用不能单独使用,需引用的作用是就跟踪对象被垃圾回收的状态,程序可以通过检测与虚引用关联的虚引用队列是否已经包含了指定的虚引用,从而了解虚引用的对象是否即将被回收。
虚引用通过PhantomRefence类实现,它本身对对象没有影响,类似与没有应用,对象甚至感觉不到
虚引用的存在,如果一个对象只有一个虚引用存在,那么他就类似没有应用存在。
也相当于一个匿名对象
new String("匿名对象");
// 创建一个引用队列
ReferenceQueue<String> rq = new ReferenceQueue<String>();
//创建一个虚引用,指定引用对象.不能单独使用必须关联引用队列
PhantomReference pr = new PhantomReference(new String("虚引用"),rq);
当虚引用的对象被回收后,如下的代码将返回true
System.out.println(rq.poll()==pr);
当程序强制垃圾回收后,只有虚引用引用字符串对象将会被垃圾回收,当被引用的对象被回收后,对应的引用将被添加到关联的引用队列中。这也是虚引用相对匿名对象的好处。
.如果使用软引用,弱引用,虚引用的引用方式引用对象,垃圾回收就能够随意的释放这些对象,
若果希望尽可能减小程序在起声明周期中所占用的内存大小,可以灵活使用这些引用。
如果使用了这些引用就不能保留这些对象的强引用(强制引用应该置null),否则就浪费了这些类提供的任何好处。
|
|