强引用
- 对对象存活时间的影响:只要存在强引用指向对象,对象就不会被垃圾回收器回收,即使内存不足也不会回收该对象,可能导致内存溢出。
- 示例:
Object strongRef = new Object();
// strongRef 是强引用,只要 strongRef 存在,new Object() 就不会被回收
软引用
- 对对象存活时间的影响:当内存足够时,软引用对象不会被回收;只有当内存不足时,垃圾回收器才会回收软引用指向的对象。常用于实现缓存。
- 示例:
SoftReference<Object> softRef = new SoftReference<>(new Object());
Object obj = softRef.get();
if (obj != null) {
// 使用 obj
} else {
// 内存不足,对象已被回收,可重新创建对象
obj = new Object();
softRef = new SoftReference<>(obj);
}
弱引用
- 对对象存活时间的影响:只要垃圾回收器扫描到弱引用指向的对象,不管当前内存是否充足,都会回收该对象。
- 示例:
WeakReference<Object> weakRef = new WeakReference<>(new Object());
Object obj = weakRef.get();
if (obj != null) {
// 使用 obj
} else {
// 对象已被回收,可重新创建对象
obj = new Object();
weakRef = new WeakReference<>(obj);
}
// 当发生垃圾回收时,weakRef 指向的对象大概率会被回收
虚引用
- 对对象存活时间的影响:虚引用对对象的生命周期没有任何影响,也无法通过虚引用来获取对象实例。主要用于对象被回收时收到系统通知。
- 示例:
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
// 无法通过 phantomRef 获取对象实例
// 当关联的对象被回收时,虚引用会被放入 ReferenceQueue 中
Reference<? extends Object> ref = referenceQueue.poll();
if (ref != null) {
// 可在这里进行对象回收后的处理
}