Java中有四种引用类型:
1、强引用
People people = new People("小明", 27);
这种我们每天都接触的new的方式就属于强引用,在内存不足的时候,Java虚拟机宁愿OOM也不会将强引用的内存回收掉。如果x显示的中断强引用people和其实例对象之间的联系,将其置空,则Jvm在回收垃圾的时候会将其内存回收掉。
2、软引用
如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它;
如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。
软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。
SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。
3、弱引用
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。下面是使用示例:
这种情况下,只要垃圾回收器执行了,就会将其内存回收。
下面我们来区分两种情况:
第一种:
WeakReference<People> wrf = new WeakReference<People>(new People("小明", 27));
System.out.println("after gc: wrf=" + wrf.get());
System.gc();
System.out.println("after gc: wrf=" + wrf.get());
执行的结果:
after gc: wrf=people[name=小明,age=27]
after gc: wrf=null
第二种:
People people = new People("小明", 27);
WeakReference<People> wrf = new WeakReference<People>(people);
System.out.println("after gc: wrf=" + wrf.get());
System.gc();
System.out.println("after gc: wrf=" + wrf.get());
执行的结果:
after gc: wrf=people[name=小明,age=27]
after gc: wrf=people[name=小明,age=27]
也就是,第一次执行Gc之后,弱引用关联的对象被回收了,而第二次没有回收!
这里所说的被弱引用关联的对象是指只有弱引用与之关联,如果存在强引用同时与之关联,则进行垃圾回收时也不会回收该对象(软引用也是如此)。
再看下面:
People people = new People("小明", 27);
WeakReference<People> wrf = new WeakReference<People>(people);
System.out.println("after gc: wrf=" + wrf.get());
people = null;
System.gc();
System.out.println("after gc: wrf=" + wrf.get());
那么,在Handler导致的内存泄漏中,就可以用弱引用的方式解决。
4、虚引用
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。在java中用java.lang.ref.PhantomReference类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。