1.对象引用介绍
从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
用表格整理之后,各个引用类型的区别如下:
2.强引用
**是指创建一个对象并把这个对象赋给一个引用变量。**如下:
public void fun1() {
Object object = new Object();
Object[] objArr = new Object[1000];
}
如果想中断强引用和某个对象之间的关联,可以显示地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
3.软引用
如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它
如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
**也就是说,一旦SoftReference保存了对一个Java对象的软引用后,在垃圾线程对 这个Java对象回收前,SoftReference类所提供的get()方法返回Java对象的强引用;垃圾线程回收该Java对象之 后,get()方法将返回null。**如下:
MyObject aRef = new MyObject();
SoftReference aSoftRef=new SoftReference(aRef);
此时,对于这个MyObject对象,有两个引用路径,一个是来自aSoftRef对象的软引用,一个来自变量aRef的强引用,所以这个MyObject对象是强可及对象。
随即,我们可以结束aReference对这个MyObject实例的强引用:
aRef = null;
此后,这个MyObject对象成为了软引用对象。如果垃圾收集线程进行内存垃圾收集,并不会因为有一个SoftReference对该对象的引用而始终保留该对象。
Java虚拟机的垃圾收集线程对软可及对象和其他一般Java对象进行了区别对待:软可及对象的清理是由垃圾收集线程根据其特定算法按照内存需求决定的。
4.弱引用
**弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。**下面是使用示例:
public static void main(String[] args) {
WeakReference<People> reference = new WeakReference<People>(new People("zhouqian",20));
System.out.println(reference.get());
System.gc();//通知GVM回收资源
System.out.println(reference.get());
}
要JVM进行垃圾回收,被弱引用关联的对象必定会被回收掉。不过要注意的是,这里所说的被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象。
Java中的WeekHashMap
5.虚引用
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。这种引用,使用的少之又少,虚引用必须和引用队列联合使用,这里了解下即可,如下:
String str=new String("abc");
//创建引用队列
ReferenceQueue<String> queue = new ReferenceQueue<String>();
//创建虚引用
PhantomReference<String> phantomReference = new PhantomReference<String>(str, queue);
6.总结
Java 中引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用。
**对于强引用,我们平时在编写代码时经常会用到。而对于其他三种类型的引用,****使用得最多的就是软引用和弱引用,**这2种既有相似之处又有区别。它们都是用来描述非必需对象的,但是被软引用关联的对象只有在内存不足时才会被回收,而被弱引用关联的对象在JVM进行垃圾回收时总会被回收。