为了更好的管理内存,有利于垃圾回收.
JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种。
强引用(Strong Reference)
如下:
List list=new ArrayList();
Map map=new HashMap();
以上都是强引用,只要强引用还存在,垃圾收集器永远都不会回收被引用的对象,即使抛出OOM异常。
软引用(Soft Reference)
软引用可以用在那些有点用但是不是必须的对象上。
对于软引用的被引用对象 来说,在内存不足即将OOM 之前会将对象回收。
可以使用SoftReference类来实现软引用。
SoftReference softReference=new SoftReference(new ArrayList<>());
//回收之前会返回 对象的强引用
softReference.get();
//假设内存不足 该对象被回收
System.gc();
//回收之后 返回null
softReference.get();
弱引用(Weak Reference)
弱引用也是使用在那些不是必需的对象上的。但是它的强度要比软引用弱一些,被弱引用关联的对象只能生存到下一次垃圾回收前。
也就是当垃圾收集器工作时,无论当前内存是否足够,对象都会被回收。
WeakReference 类可以来实现弱引用。
WeakReference weakReference=new WeakReference(new ArrayList<>());
//回收之前会返回 对象的强引用
weakReference.get();
System.gc();
//回收之后 返回null
weakReference.get();
虚引用(PhantomReference)
虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。
一个对象是否有虚引用,完全不会对其生存时间构成影响。也无法通过虚引用得到一个对象的强引用。
虚引用需要和引用队列一起使用,如果一个对象设置了虚引用,在对象被回收时,虚引用将会加入了引用队列之中。
如下:
public static void main(String []a)throws Exception{
ReferenceQueue referenceQueue=new ReferenceQueue();
PhantomReference phantomReference=new PhantomReference(new String("I Love LSM"), referenceQueue);
Object obj= referenceQueue.poll();
System.out.println("垃圾回收前:"+obj);
System.gc();
Thread.sleep(3000);
Object object=referenceQueue.poll();
System.out.println("垃圾回收后:"+object);
}
注意: System.gc()调用只是通知虚拟机进行回收,垃圾收集器并不一定马上会进行垃圾回收。
参考资料
学习摘抄于深入理解Java虚拟机