什么是虚引用?

虚引用是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日

相关文章

  • Java从JDK源码角度对Object进行实例分析

    讲解“Java从JDK源码角度对Object进行实例分析”的攻略如下: 一、分析Object类的源码 先介绍下Object类的源码结构: public class Object { private static native void registerNatives(); static { registerNatives(); } public final …

    Java 2023年5月26日
    00
  • SpringBoot搭建全局异常拦截

    一、概述 在使用Spring Boot开发Web应用的过程中,我们经常会遇到程序抛出异常的情况。如何优雅地处理这些异常,返回友好的错误信息给客户端,是很重要的一件事情。Spring Boot提供了全局异常处理机制,可以方便地实现统一的异常处理逻辑,减少代码重复,提高开发效率。 本文将介绍如何使用Spring Boot自带的全局异常处理机制,搭建一个通用的全局…

    Java 2023年5月27日
    00
  • java基于C/S模式实现聊天程序(服务器)

    接下来我将为您详细讲解如何基于C/S模式实现Java聊天程序(服务器端)的攻略。以下是具体步骤: 1. 了解C/S模式的概念和原理 在C/S(Client/Server)模式下,客户端和服务器通过网络互相通信。客户端向服务器发出请求,服务器则将请求的结果发送回客户端。在聊天程序中,服务器端主要负责接收客户端发送的信息,处理并转发给其他在线的客户端。 2. 编…

    Java 2023年5月23日
    00
  • SpringBoot整合SpringDataJPA

    Spring Boot整合Spring Data JPA Spring Data JPA是Spring Framework的一部分,它提供了一种简单的方式来访问关系型数据库。Spring Boot提供了对Spring Data JPA的自动配置支持,使得整合Spring Data JPA变得非常简单。在本文中,我们将介绍如何使用Spring Boot整合Sp…

    Java 2023年5月15日
    00
  • Spring动态注册多数据源的实现方法

    下面为您详细讲解“Spring动态注册多数据源的实现方法”的完整攻略。 1. 前言 在实际开发中,我们常常会遇到需要使用多个数据源的情况,而且这些数据源可能会在程序运行过程中动态变化。比如说,有些系统会支持多租户,每个租户对应一个数据库,而且租户的数量是不固定的。这种情况下,我们就需要动态注册多个数据源,并在运行时根据需要选择合适的数据源。 Spring提供…

    Java 2023年5月20日
    00
  • 教你1秒将本地SpringBoot项目jar包部署到Linux环境(超详细!)

    好,这里是“教你1秒将本地SpringBoot项目jar包部署到Linux环境(超详细!)”的完整攻略。 1. 前置条件 在开始操作前,需要准备好以下环境: 一台Linux服务器,能够连接到互联网,并且已经安装好了Java运行环境(JRE 或 JDK)。 一份SpringBoot应用程序代码,在本地环境已经编译为可运行的jar包。 本教程中的示例代码可以在我…

    Java 2023年5月19日
    00
  • 利用JDBC的PrepareStatement打印真实SQL的方法详解

    利用JDBC的PrepareStatement打印真实SQL的方法详解: JDBC中的PrepareStatement对象是常用的执行SQL语句的方式,通过prepareStatement构建出的SQL语句是带有参数占位符的。然而,有时候我们需要查看这个SQL语句的完整内容,包括占位符的具体值。我们可以通过以下步骤达到目的: 将占位符的具体值设置进Prepa…

    Java 2023年6月16日
    00
  • Bootstrap实现翻页效果

    大致步骤如下: 1. 引入Bootstrap库 在头部引入Bootstrap的css和js文件 <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.3.1/css/bootstrap.min.css"> <script sr…

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