在Java中,强引用、软引用、弱引用和虚引用是用于管理对象生命周期的不同类型的引用。它们的主要作用是帮助垃圾回收器(GC)决定何时回收对象,从而更高效地管理内存。
强软弱虚,按照这个顺序,对象的引用的强度越来越弱。
强引用 强引用是Java的默认引用形式,使用时不需要显示定义。如果一个对象具有强引用,那垃圾回收器绝不会回收它(可达时)。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。
1 String[] arr = new String[]{"a", "b", "c"}; 案例 强引用是默认的引用方式,我们创建的new 一个对象,就是用的强引用,即如果引用一直在,就不会被 GC 回收掉。
在集合中, 如我们常见的HashMap使用的引用就是强引用,也就是说垃圾收集的时候,Map中引用的对象不会被GC掉。
软引用 软引用是一种相对较弱的引用类型,用于表示对对象的“非强”引用。
软引用是使用SoftReference来创建对象的方式,如SoftReference<Object> softRef = new SoftReference<>(new Object());就是软引用。
当内存不足时,垃圾回收器会优先回收软引用指向的对象,以释放内存。软引用可以在系统内存充足时保留对象,以提高性能(缓存机制)。
1 SoftReference<String[]> softBean = new SoftReference<String[]>(new String[]{"a", "b", "c"}); 案例 在 Guava Cache 中,有关于软引用的使用:
1 2 3 4 5 6 7 8 9 10 class LocalCache<K, V> extends AbstractMap<K, V> implements ConcurrentMap<K, V> { static class SoftValueReference<K, V> extends SoftReference<V> implements ValueReference<K, V> { final ReferenceEntry<K, V> entry; SoftValueReference(ReferenceQueue<V> queue, V referent, ReferenceEntry<K, V> entry) { super(referent, queue); this.entry = entry; } } } LocalCache 类用到了 SoftReference 来实现软引用缓存。通过软引用,来方便在内存不足时能自动回收缓存对象,来避免 OOM 的发生。
...