强引用、软引用、弱引用、虚引用分别是什么?

强引用

JAVA中最常见的一种引用,强引用的对象就算出现了OOM,JVM也不会对他进行回收的。当一个对象被强引用指向时,处于可达状态,即使它永远不会被用到,也不会被JVM的回收机制回收的。

对于普通对象而言,只要他超出了引用范围or手动把引用变量置null,它就可以认为被JVM回收

软引用

内存不够时才回收,够时就不回收

适用场景

假如有一个应用需要读取大量的本地图片:

  • 如果每次读取图片都从硬盘读取则会严重影响性能,
  • 如果一次性全部加载到内存中又可能造成内存溢出。

这时候就可以利用软引用的内存不够才回收的特性,采用一个Map把图片路径和图片内容关联起来,可以有效避免OOM

Map<String, SoftReference> imageCache = new HashMap<String, SoftReference>();


弱引用

WeakReference

不管内存够不够用,只要JVM一触发回收,弱引用指向的对象就会被回收

虚引用

必定会被回收,一般配合引用队列使用,可用于监控回收