在深入探讨Java中`SoftReference`何时会被垃圾回收之前,我们首先需要理解Java内存管理的基本概念,特别是垃圾回收(Garbage Collection, GC)机制以及不同类型的引用对象。`SoftReference`是Java中四种引用类型之一(强引用、软引用、弱引用、虚引用),它提供了一种比强引用更弱、但比弱引用更强的引用方式,用于实现内存敏感的高速缓存。
### Java内存管理与垃圾回收基础
Java虚拟机(JVM)的内存主要分为几个部分:堆(Heap)、栈(Stack)、方法区(Method Area,包括元空间Metaspace在Java 8及以后版本中)等。其中,堆是存放对象实例的主要区域,也是垃圾回收的主要关注区域。垃圾回收器的主要任务是识别并释放那些不再被程序使用的对象所占用的内存空间。
### 引用类型概述
- **强引用(Strong Reference)**:最常见的引用类型,只要强引用存在,垃圾回收器就永远不会回收被引用的对象。
- **软引用(Soft Reference)**:一种较为柔性的引用,在系统将要发生内存溢出异常之前,会将这些对象列进回收范围之中进行第二次考虑。如果这次回收后还没有足够的内存,才会抛出内存溢出异常。因此,软引用通常用于实现内存敏感的高速缓存。
- **弱引用(Weak Reference)**:比软引用更弱,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收只被弱引用关联的对象。
- **虚引用(Phantom Reference)**:也称为幽灵引用或幻影引用,是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。
### SoftReference的工作机制
`SoftReference`类在`java.lang.ref`包下,它继承自`Reference`类。使用`SoftReference`可以包裹一个对象,使得这个对象成为软可及(softly reachable)的,即在没有足够的内存时会被回收,但在内存充足的情况下则不会被回收。
#### 创建SoftReference
```java
Object obj = new Object();
SoftReference