JDK8中的引用类型包括强引用、软引用、弱引用和虚引用。每种引用类型都有其特定的用途和特性。让我们逐一讨论这些引用类型,并通过代码示例来说明它们的使用场景。
-
强引用 (Strong Reference)
概念:这是最常见的引用类型。只要强引用存在,垃圾回收器就不会回收被引用的对象。可能会造成OOM。
使用场景:日常编程中最常用的引用类型,用于保持对象的生命周期。
代码示例:
Objectobj =newObject();// 强引用
-
软引用 (Soft Reference)
概念:软引用对象不会被立即回收。只有在系统内存不足时,才会被垃圾回收器回收。
使用场景:实现内存敏感的缓存。当内存足够时,缓存会保留在内存中;当内存不足时,缓存会被清理。
代码示例:
import java.lang.ref.SoftReference; publicclassSoftReferenceExample{publicstaticvoidmain(String[] args){// 创建一个软引用SoftReference<byte[]> softRef =newSoftReference<>(newbyte[1024*1024*10]);// 10MB 数组 System.out.println(softRef.get()); System.gc();// 触发垃圾回收 // 如果内存充足,软引用对象不会被回收System.out.println(softRef.get()); // 分配大量内存,使系统内存不足byte[] largeArray =newbyte[1024*1024*15];// 15MB 数组 // 此时软引用很可能被回收System.out.println(softRef.get());}}
-
弱引用 (Weak Reference)
概念:弱引用的对象只能生存到下一次垃圾收集之前。当垃圾收集器工作时,无论内存是否充足,都会回收被弱引用关联的对象。
使用场景:实现对象的规范化映射,比如WeakHashMap。
代码示例:
import java.lang.ref.WeakReference; publicclassWeakReferenceExample{publicstaticvoidmain(String[] args){// 创建一个弱引用WeakReference<String> weakRef =newWeakReference<>(newString("Hello, Weak Reference!")); System.out.println(weakRef.get()); System.gc();// 触发垃圾回收 // 弱引用很可能在这里被回收System.out.println(weakRef.get());}}
-
虚引用 (Phantom Reference)
概念:虚引用是最弱的引用关系。随时可能被垃圾回收器回收。虚引用主要用来跟踪对象被垃圾回收的活动。
使用场景:跟踪对象的回收,在对象被回收时做一些清理工作。常用于管理直接内存等资源。
代码示例:
import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue; publicclassPhantomReferenceExample{publicstaticvoidmain(String[] args) throws InterruptedException{ReferenceQueue<Object> queue =newReferenceQueue<>();PhantomReference<Object> phantomRef =newPhantomReference<>(newObject(), queue); System.out.println(phantomRef.get());// 总是返回null System.gc();Thread.sleep(1000); // 检查是否有引用被加入到队列中(即被回收)if(queue.poll() !=null) {System.out.println("Object has been collected.");}}}
总结:
-
强引用是最常用的引用类型,用于保持对象存活。
-
软引用适用于内存敏感的缓存场景。
-
弱引用常用于实现规范化映射,当key不再被使用时,相应的entry可以被回收。
-
虚引用主要用于跟踪对象的回收过程,可以用来做一些资源清理的操作。
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/3234.html