Java中的四种引用类型

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类表示。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

感谢博主 https://www.cnblogs.com/huajiezh/p/5835618.html

猜你喜欢

转载自blog.csdn.net/fisheryujie/article/details/81668336