JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)。这四种对象引用强度依次减弱。
- 强引用
强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()"这样的引用,强引用环境下,垃圾回收时需要严格判断当前引用是否为强引用,若判断为强引用,则不会被垃圾回收。当内存空间不足时,JVM宁愿抛出OOM错误,使程序异常终止,也不会随意回收具有强引用关联的对象来解决内存不足的问题。
- 软引用
软引用是用来描述一些还有用但并非必须的对象。软引用一般被作为缓存来使用,在垃圾回收时,虚拟机会根据当前内存使用情况来决定是否对软引用进行回收,如果系统剩余内存比较紧张,则虚拟机会回收软引用所引用的空间,如果剩余内存相对富余,则不会进行回收。
- 弱引用
弱引用与软引用类似,但是它的强度比软引用更弱一些, 在进行垃圾回收时,无论当前内存是否足够,都会回收掉只被弱引用关联着的对象,因此其生命周期只存在于一个垃圾回收周期内。例如WeakHashMap就是一个以弱键实现的基于Hash表的Map,当某个键不再正常使用时,便自动移除其条目。
- 虚引用
虚引用也成为幽灵引用或者幻影引用,它是最弱的一种引用关系。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。