什么是虚引用?

虚引用是Java中四种引用类型之一,是一种比弱引用还弱的引用类型。它的主要作用是帮助跟踪对象的销毁过程,但不能通过虚引用访问到对象。在Java中,虚引用被用于在对象被销毁之前进行必要的清理工作,例如关闭文件、释放系统资源等任务。

虚引用通常会被用在以下情况中:

  • 在对象销毁的同时,进行一些资源释放操作。
  • 追踪对象被垃圾回收机制回收的过程,进而查看对象的回收状态。
  • 当虚引用指向的对象被垃圾回收器回收时,虚引用将被放入一个队列中,用于进一步的处理。

使用虚引用,需要注意以下几点:

  • 虚引用必须与引用队列(ReferenceQueue)一起使用,虚引用指向的对象被垃圾回收时,将被加入到引用队列中,程序可以在引用队列中获取到虚引用。与ReferenceQueue配合使用,可以实现一些比较复杂的操作,例如资源释放、对象的自我复活等。
  • 虚引用不能用来取得对象的引用,因为虚引用所指向的对象随时可能被垃圾回收机制回收。
  • 虚引用的get()方法始终返回null。

下面是两个虚引用的示例:

示例1

Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
WeakReference<Object> weakRef = new WeakReference<>(obj, queue);
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue); //创建一个虚引用

obj = null; //让对象成为“垃圾”

System.gc(); //通知JVM的垃圾回收器进行垃圾回收

//检查队列中是否有虚引用
Reference<?> ref = queue.poll();
while (ref != null) {
    System.out.println("queue中的引用对象: " + ref);
    // 被关联的对象被清除后,虚引用才会被添加至队列中
    if (ref == phantomRef) {
        System.out.println("phantom reference被加入到了队列中");
    }
    if (ref == weakRef) {
        System.out.println("weak reference被加入到了队列中");
    }
    ref = queue.poll();
}

运行示例1,输出如下:

weak reference被加入到了队列中
phantom reference被加入到了队列中

从输出结果中可以看出,被弱引用和虚引用所引用的对象被回收后,这些引用都被加入到了队列中。

示例2

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;

public class PhantomRefTest {
    public static void main(String[] args) {
        Object obj = new Object();
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);

        obj = null;
        System.gc();

        Reference<?> ref = queue.poll();
        while (ref != null) {
            System.out.println("queue中的引用对象: " + ref);
            if (ref == phantomRef) {
                System.out.println("对象被垃圾回收了");
            }
            ref = queue.poll();
        }
    }
}

运行示例2,输出如下:

queue中的引用对象: java.lang.ref.PhantomReference@74a14482
对象被垃圾回收了

从输出结果可以看出,当虚引用所引用的对象被垃圾回收机制回收时,这个虚引用将被加入到引用队列中,并可以在队列中获取到它。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是虚引用? - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • 详解使用Jenkins部署Spring Boot项目

    我们来详细讲解下如何使用Jenkins部署Spring Boot项目吧。 1. 准备工作 首先,我们需要安装好Jenkins和Java环境,并确保Jenkins服务启动正常。 然后,我们需要在Jenkins中安装相关的插件,如Git插件、Maven插件、Deploy to Container插件等。这些插件可以协助我们实现自动化部署。 最后,我们需要准备好我…

    Java 2023年5月20日
    00
  • React Native JSI实现RN与原生通信的示例代码

    React Native JSI 是 React Native 的一个新特性,它可以实现 RN 与原生端的通信。JSI 基于 C++,所以可以很好地利用移动设备的 CPU 和 GPU 功能,从而提高应用程序的性能和可维护性。 要使用 RN JSI,需要在项目中安装相应的模块和库,例如 Folly 和 TurboModules。接下来,我们将详细讲解如何在 R…

    Java 2023年6月15日
    00
  • Tomcat在Linux服务器上的BIO、NIO、APR模式设置方法

    Tomcat在Linux服务器上的BIO、NIO、APR模式设置方法攻略 Tomcat是一款使用广泛的Java Web应用服务器,在Linux服务器上也很常见。Tomcat的性能和稳定性与其运行模式密切相关,本文将详细介绍如何在Linux服务器上设置Tomcat的BIO、NIO、APR三种模式,让Tomcat运行更加高效和稳定。 BIO模式设置方法 BIO是…

    Java 2023年5月19日
    00
  • SpringMVC整合SSM实现表现层数据封装详解

    SpringMVC整合SSM实现表现层数据封装详解 在Web应用程序中,表现层数据封装是非常重要的,它可以帮助我们将请求参数封装成Java对象,方便我们在控制器中进行处理。本文将详细介绍如何使用SpringMVC整合SSM实现表现层数据封装,并提供两个示例说明。 步骤1:创建Maven项目 首先,我们需要在IDEA中创建一个Maven项目。在创建项目时,我们…

    Java 2023年5月17日
    00
  • Java中实现String字符串用逗号隔开

    实现Java中用逗号隔开字符串有多种方法,其中最常见的方法是使用String类提供的split()方法来实现。下面将提供两个示例来说明如何使用split()方法实现用逗号隔开字符串的功能。 示例一:使用split()方法 String str = "apple,banana,orange"; String[] strArr = str.s…

    Java 2023年5月26日
    00
  • IDEA2020.1启动SpringBoot项目出现java程序包:xxx不存在

    当使用IDEA 2020.1版本启动Spring Boot项目时,可能会遇到以下错误提示: java程序包:xxx不存在 这个错误通常是由于项目的依赖项有问题导致的。为了解决这个问题,可以采取以下步骤: 步骤一:清除Maven本地仓库 打开命令行窗口,输入以下命令清除Maven本地仓库: mvn clean 这个命令会清除本地Maven仓库中的缓存文件。接下…

    Java 2023年5月19日
    00
  • SpringBoot+SpringSecurity+JWT实现系统认证与授权示例

    下面是“SpringBoot+SpringSecurity+JWT实现系统认证与授权”的完整攻略: 一、什么是Spring Boot、Spring Security和JWT Spring Boot:是一个快速开发框架,能够简化Spring应用程序的创建和开发过程。 Spring Security:是Spring框架中提供的一套安全服务框架,可以用来保护Web…

    Java 2023年5月20日
    00
  • java SpringMVC学习使用详解

    Java SpringMVC是一种常用的Web框架,具有灵活、高效、简洁等特点。如果你正在学习或者准备学习Java SpringMVC,以下是一个基本的攻略: 1. 前置条件 在学习Java SpringMVC之前,需要具备一定的Java基础和Web开发知识。推荐先学习Servlet和JSP技术。 2. 安装和配置 安装Java和Maven,然后在Maven…

    Java 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部