强引用、软引用、弱引用和虚引用

1、强引用(Strong Reference)

强引用是最常见的引用类型。如果一个对象具有强引用,那么垃圾回收器就不会回收它。只有当强引用不再指向一个对象时,该对象才会被垃圾回收。内存不足时,即使出现OOM(内存溢出)也不会回收强引用的对象。

例如:

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

2、软引用(Soft Reference)

软引用主要用于实现内存敏感的缓存。只有在内存不足时,垃圾回收器才会回收被软引用关联的对象。软引用通常用于实现一些可有可无的大对象,如果内存充足,则保留这些对象;如果内存不足,则回收这些对象以节省内存空间。

例如:

import java.lang.ref.SoftReference; Object obj = new Object(); // 强引用 
SoftReference<Object> softRef = new SoftReference<>(obj); // 软引用

3、弱引用(Weak Reference)

弱引用用于实现非必需对象的内存释放。只要垃圾回收器运行,无论内存是否足够,都会被回收。弱引用通常用于实现一些生命周期较短的对象,或者关联较大的对象,以便在不影响程序运行的情况下尽快回收内存。

例如:

import java.lang.ref.WeakReference; Object obj = new Object(); // 强引用
WeakReference<Object> weakRef = new WeakReference<>(obj); // 弱引用

4、虚引用(Phantom Reference)

虚引用也主要用于跟踪对象被垃圾回收的状态。虚引用对对象本身的操作影响力非常小,无法改变对象的生命周期。主要和引用队列联合使用,在finalize之前会被放到引用队列中。虚引用通常用于在垃圾回收器准备回收一个对象之前执行某些操作,如关闭文件、释放网络资源等。

例如:

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.io.Closeable;
import java.io.IOException;

class Closer extends Closeable {
    private PhantomReference<Object> phantomRef;
    private ReferenceQueue<Object> refQueue;

    public Closer(Object obj, ReferenceQueue<Object> refQueue) {
        this.phantomRef = new PhantomReference<>(obj, refQueue); // 虚引用
        this.refQueue = refQueue;
    }

    @Override
    public void close() throws IOException {
        phantomRef = null; // 清除虚引用,使其不能再被访问到
        try {
            refQueue.remove(); // 从队列中移除此虚引用对象,以便垃圾回收器可以回收它所指向的对象
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            super.close(); // 关闭资源,如文件、网络连接等
        }
    }
}

相关推荐

  1. 引用引用引用引用

    2023-12-08 16:42:03       39 阅读
  2. 【Flutter 面试题】 dart是引用还是引用?

    2023-12-08 16:42:03       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 16:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 16:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 16:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 16:42:03       20 阅读

热门阅读

  1. 1、命名空间、C++的复合类型、缺省参数

    2023-12-08 16:42:03       32 阅读
  2. STM32-OLED显示屏

    2023-12-08 16:42:03       34 阅读
  3. 硬件时间与系统时间同步

    2023-12-08 16:42:03       38 阅读
  4. php研究课题

    2023-12-08 16:42:03       36 阅读
  5. MongoTemplate 常用查询

    2023-12-08 16:42:03       27 阅读
  6. C/C++ 快速排序

    2023-12-08 16:42:03       37 阅读
  7. C语言-动态内存分配

    2023-12-08 16:42:03       36 阅读
  8. 一文详解:什么是https 加密协议?

    2023-12-08 16:42:03       35 阅读