Java中有四类引用:强引用,软引用,弱引用,虚引用,强度依次减弱
强引用:是指在程序代码之中普遍存在的引用赋值,如
Object obj=new Object():
无论在任何情况下,只要强引用关系还存在,垃圾回收器就不会回收掉被引用的对象。对一个一个普通对象,如果没有其他引用关系,只要超过了引用的作用域或者显式的将其赋值为null,则可以当作垃圾收集了。强引用是造成Java内存泄露的主要原因。
在系统要发生内存溢出之前时,将回收这些对象。
Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;//去除强引用,只保留软引用
被弱引用关联的对象只能生存到下一次垃圾回收之前。无论内存空间是否足够,都会回收掉被弱引用关联的对象。
Object obj = new Object();
WeakReference<Object> sf = new WeakReference<Object>(obj);
obj = null;//去除强引用,只保留弱引用
一个对象是否有虚引用的存在,完全不会对其生存时间构成影响。虚引用的get方法总是返回null,因此无法访问对应的引用对象,设置虚引用关联唯一的目的是在对象被收集器回收的时候收到一个系统通知,或者后续添加进一步的处理。Java允许使用finalize()方法在垃圾回收器将对象从内存中清理出去之前做一些必要的清理工作,虚引用仅仅是提供一种确保对象被finalize以后,做某些事情的机制。
虚引用必须和引用队列一起使用。虚引用在创建时提供一个引用队列queue作为参数。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。当虚引用所引用的对象已经执行完finalize函数的时候,就会把对象加到queue里面。可以通过判断queue里面是不是有对象来判断对象是不是要被回收了。
ReferenceQueue<Object> queue = new ReferenceQueue<>();
Object obj = new Object();
PhantomReference phantomRef = new PhantomReference<Object>(obj,queue);
obj = null;