在JDK1.2之前,引用的定义只是reference类型的数据中存储的数值代表的是另外一块内存的起始地址,那么这块内存就代表着一个引用;在这种情况下,一个对象只有被引用和没有被引用这两种状态;
而在1.2之后,Java扩充了引用的概念:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference),四种引用强度依次减弱;
- 强引用:强引用是我们在日常编码中使用最多的方式,类似Object obj = new Object();这类的引用就是强引用;强引用只要还存在,被引用的对象就永远不会被GC回收,哪怕报OOM错,系统奔溃;
- 软引用:软引用可以用来表示一些有用但是非必须的对象,一个被软引用关联的对象,在内存不够,即将内存溢出异常之前,将会被标记成待回收对象而被回收掉,如果回收之后内存任然不够,才会OOM错误;使用方法是SoftReference<Object> sr = new SoftReference<Object>(obj);通过sr.get();来获取对象,如果已经被标记成待回收对象GC掉,返回结果是null;
- 弱引用:弱引用的强度比弱引用还要弱,被引用的对象不管内存是否足够,在下次垃圾回收时都会被回收掉,可以通过弱引用的isEnQueued方法获知对象是否被回收;
- 虚引用:虚引用时强度最弱的,也被称为幽灵引用或幻影引用,虚引用对对象的生命周期完全没有影响,无法通过虚引用来获取对象,为一个对象设置虚引用的唯一目的就是在这个对象被回收时会收到系统通知,可以通过isEnQueued方法获知对象是否被回收;