java引用漫谈
jdk1.2以前,如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。这种情况下,一个对象只有被引用或没有被引用两种状态。
jdk1.2以后,Java对引用概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用四种。强度依次减弱。
引用的细分使得Java对内存回收的控制也更精细。
强引用
Object obj = new Object(); 只要引用存在,gc就不会回收被引用的对象。
软引用
用来描述还有用但不必需的对象。在系统将要发生内存溢出之前,列入回收范围进行回收。但如果内存足够,就不会回收。
如果这次回收还没有足够的内存,才会抛出内存溢出的异常。
弱引用
描述非必需对象,但比弱引用更弱。
只能生存到下一次垃圾收集发生之前。无论内存是否足够,都会回收。
虚引用
又名幽灵引用或幻影引用,是最弱的一种引用关系。一个对象是否有虚引用存在,对其生存时间没有任何影响。
为一个对象设置虚引用的唯一目的就是能在对象被gc回收前收到一个系统通知。