前言
在Java中,引用类型主要有四种:强引用、软引用、弱引用和虚引用。它们之间的区别主要体现在垃圾回收器对它们的处理方式上。本文分别介绍这四种引用类型,并给出相应的代码示例。
1. 强引用(Strong Reference)
强引用是最常见的引用类型,我们平时使用的普通对象引用就是强引用。只要对象具有强引用,垃圾回收器就永远不会回收它。即使内存不足,也会导致程序抛出OutOfMemoryError异常。
代码语言:javascript复制Object obj = new Object(); // 强引用
2. 软引用(Soft Reference)
软引用是一种比强引用稍微弱一些的引用类型。只有在系统将要发生内存溢出之前,才会被垃圾回收器回收。如果内存足够,垃圾回收器就不会回收它。软引用通常用于实现内存敏感的缓存。
代码语言:javascript复制import java.lang.ref.SoftReference;
public class SoftReferenceDemo {
public static void main(String[] args) {
SoftReference<Object> softRef = new SoftReference<>(new Object()); // 软引用
System.out.println("软引用:" softRef.get());
System.gc(); // 提示JVM进行垃圾回收
System.out.println("软引用:" softRef.get());
}
}
3. 弱引用(Weak Reference)
弱引用是一种比软引用更弱的引用类型。只要垃圾回收器发现它,就会立即回收。弱引用主要用于实现规范的映射关系。
代码语言:javascript复制import java.lang.ref.WeakReference;
public class WeakReferenceDemo {
public static void main(String[] args) {
WeakReference<Object> weakRef = new WeakReference<>(new Object()); // 弱引用
System.out.println("弱引用:" weakRef.get());
System.gc(); // 提示JVM进行垃圾回收
System.out.println("弱引用:" weakRef.get());
}
}
4. 虚引用(Phantom Reference)
虚引用是四种引用类型中最弱的一种。它与垃圾回收过程没有直接关系,主要用于跟踪对象被垃圾回收器回收的活动。必须和引用队列一起使用。
代码语言:javascript复制import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
public class PhantomReferenceDemo {
public static void main(String[] args) {
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue); // 虚引用
System.out.println("虚引用:" phantomRef.get());
System.gc(); // 提示JVM进行垃圾回收
PhantomReference<Object> clearedPhantomRef = (PhantomReference<Object>) referenceQueue.poll();
System.out.println("虚引用:" clearedPhantomRef.get());
}
}
区别
1、生命周期:强引用的对象一直存活直到显式地被回收;软引用的对象在内存不足时可以被回收;弱引用的对象在下一次垃圾回收时会被回收;虚引用的对象对对象的生命周期没有任何影响。
2、垃圾回收:强引用阻止垃圾回收;软引用允许垃圾回收在内存不足时进行;弱引用在垃圾回收时总是被回收;虚引用对垃圾回收没有直接影响,但可以用来得知对象何时被回收。
3、用途:强引用用于普通的对象引用;软引用适用于内存敏感的缓存;弱引用适用于映射表,可以自动清理不再使用的对象;虚引用主要用于跟踪对象的回收。
4、访问对象:强引用可以直接访问对象;软引用和弱引用需要通过get()方法访问对象,如果对象已经被回收,则返回null;虚引用无法直接访问对象,get()方法总是返回null。
小结
强引用、软引用、弱引用和虚引用之间的主要区别在于它们对垃圾回收器的抵抗力。强引用最强,软引用次之,弱引用再次之,虚引用最弱。根据实际需求选择合适的引用类型,可以提高程序的性能和内存管理效率。