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

强引用
JAVA中最常见的一种引用,强引用的对象就算出现了OOM,JVM也不会对他进行回收的。当一个对象被强引用指向时,处于可达状态,即使它永远不会被用到,也不会被JVM的回收机制回收的。
对于普通对象而言,只要他超出了引用范围or手动把引用变量置null,它就可以认为被JVM回收
软引用
内存不够时才回收,够时就不回收
适用场景
假如有一个应用需要读取大量的本地图片:
- 如果每次读取图片都从硬盘读取则会严重影响性能,
- 如果一次性全部加载到内存中又可能造成内存溢出。
这时候就可以利用软引用的内存不够才回收的特性,采用一个Map把图片路径和图片内容关联起来,可以有效避免OOM
Map<String, SoftReference

弱引用
WeakReference
不管内存够不够用,只要JVM一触发回收,弱引用指向的对象就会被回收
虚引用
必定会被回收,一般配合引用队列使用,可用于监控回收