- 强引用:我们绝大部分使用的都是强引用,比如说我们new出来的对象,通过反射创建的对象都是强引用。当内存不足时,JVM宁愿抛出OOM异常,也不会回收强引用对象
- 软引用:有用但不是必须,如果发生GC并且内存不足时才会回收,比如说本地缓存Caffine就可以设置成软引用
- 弱引用:几乎没用,只要发生GC就会回收。比如,ThreadLocal在ThreadLocalMap源码中就是一个弱引用,这里弱引用是为了避免内存泄漏,自动回收key对象
- 虚引用:不算引用,不能通过虚引用获得对象,也不影响对象的生命周期。用途是在对象被回收之前做一些措施。