Java中有哪几种引用类型?

186 阅读2分钟

Java中的引用类型主要分为四种,它们决定了对象如何被垃圾回收器(GC)处理,适用于不同的内存管理场景:


1. ​强引用(Strong Reference)​

  • 特点​:最常见的引用类型。只要存在强引用指向对象,​垃圾回收器绝不会回收该对象​(即使内存不足时可能抛出OutOfMemoryError)。

  • 使用场景​:普通对象赋值(默认引用类型)。

  • 示例​:

    Object obj = new Object(); // obj是强引用
    

2. ​软引用(Soft Reference)​

  • 特点​:通过SoftReference类实现。描述有用但非必需的对象。​内存不足时,GC会回收软引用对象(在抛出OOM前清理)。

  • 使用场景​:实现内存敏感的缓存(如缓存图片、临时数据)。

  • 示例​:

    SoftReference<Object> softRef = new SoftReference<>(new Object());
    Object obj = softRef.get(); // 可能返回null(若被回收)
    

3. ​弱引用(Weak Reference)​

  • 特点​:通过WeakReference类实现。描述非必需对象,​无论内存是否充足,​一旦发生GC就会被回收

  • 使用场景​:避免内存泄漏(如WeakHashMap的键引用)。

  • 示例​:

    WeakReference<Object> weakRef = new WeakReference<>(new Object());
    Object obj = weakRef.get(); // 可能已被回收
    

4. ​虚引用(Phantom Reference)​

  • 特点​:通过PhantomReference类实现。​无法通过虚引用访问对象​(get()始终返回null),主要用于跟踪对象被回收的状态。必须与ReferenceQueue配合使用。

  • 使用场景​:在对象被回收时执行特定清理操作(如释放堆外内存)。

  • 示例​:

    ReferenceQueue<Object> queue = new ReferenceQueue<>();
    PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), queue);
    // 对象被回收时,phantomRef会被加入队列
    

引用队列(ReferenceQueue)

  • 作用​:软引用、弱引用、虚引用可关联引用队列。当对象被回收时,引用对象(如SoftReference)会被加入队列,用于后续通知或清理操作。

总结

引用类型回收时机用途
强引用永不回收(除非无强引用)默认对象引用
软引用内存不足时回收缓存
弱引用每次GC时回收避免内存泄漏(如WeakHashMap)
虚引用回收时跟踪资源清理通知

理解不同引用类型的特点,可以优化内存管理并避免内存泄漏问题。