Java对象引用支持4种级别,从高到低分别是:强引用、软引用、弱引用和虚引用,用于控制灵活的控制对象的生命周期。
一、强引用
强引用就是我们平时创建的对象实例,JVM执行垃圾回收时,只要对象实例的引用还在,在内存不足时宁愿抛出OOM也不会对它进行回收。
private static void testStrongReference() {
Object obj = new Object();
System.gc();
System.out.println(obj); // 对象还在
}
二、软引用
软引用通过SoftReference对象进行创建,并传入被引用的对象,当被引用对象为null时,JVM在执行垃圾回收时,只有内存不足时才会对软引用进行回收, 软引用通常用于缓存数据。
private static void testSoftReference() {
Object obj = new Object();
SoftReference sr = new SoftReference(obj);
obj = null;
System.gc();
System.out.println(sr.get()); // 内存足够时,对象还在
}
三、弱引用
WeakReference弱引用相对软引用是弱引用的对象生命周期更短暂,JVM执行垃圾回收时,无论内存是否不足,都会回收弱引用对象,弱引用通常也是用于缓存数据。
private static void testWeakReference() {
Object obj = new Object();
WeakReference wr = new WeakReference(obj);
obj = null;
System.gc();
System.out.println(wr.get()); // 对象不在了
}
四、虚引用
PhantomReference虚引用是虚无缥缈的引用,通过虚引用获取的对象永远都为空,虚引用的作用主要用于监听垃圾回收,JVM执行垃圾收回前会把虚引用放入到引用队列ReferenceQueue中,可以通过监听ReferenceQueue来了解引用的对象是否被JVM回收,以及释放资源等。
private static void testPhantomReference() throws Exception {
Object obj = new Object();
ReferenceQueue<Object> rq = new ReferenceQueue();
PhantomReference<Object> pr = new PhantomReference(obj, rq);
System.out.println("--------垃圾回收前-------");
System.out.println(pr.get()); // 对象无论什么时候获取,都不在
System.out.println(rq.poll());
obj = null;
System.out.println("--------垃圾回收后-------");
System.gc();
Thread.sleep(500);
System.out.println(pr.get());
System.out.println(rq.poll()); // 可以看到对象信息
}
五、小结
引用类型 | 引用对象生存周期 | 应用场景 |
---|---|---|
强引用 | 不会被回收 | 通常的对象创建 |
软引用 | 内存不足时回收 | 数据缓存 |
弱引用 | 执行垃圾回收时回收 | 数据缓存 |
虚引用 | 一直不存在 | 监听垃圾回收、释放资源 |
打赏