Java引用类型:强引用、软引用、弱引用和虚引用

devtools/2024/10/22 14:32:48/

导言: 在Java中,引用类型是内存管理的重要组成部分。本文将深入介绍强引用、软引用、弱引用和虚引用,为您解析它们的特性以及如何在


1. 强引用(Strong Reference):

  • 定义: 强引用(Strong Reference)是Java中最为普遍的引用类型。当一个对象被强引用关联时,垃圾回收器不会回收这个对象,即使系统内存不足也不会回收。只有当该对象的强引用被显式地释放,或者不再被任何引用关联时,该对象才会成为垃圾回收的候选对象。
  • 示例代码:
     
    public class StrongReferenceExample {public static void main(String[] args) {// 创建一个对象并建立强引用Object obj = new Object(); // 强引用// 对象仍然存在,可以正常使用System.out.println("Object is still accessible.");// 解除对对象的强引用obj = null;// 系统内存充足时,垃圾回收器可能不会立即回收// 只有在需要释放内存时,垃圾回收器才会回收不再被引用的对象}
    }

    在这个例子中,创建了一个对象并建立了强引用。即使在解除对对象的强引用后,只要系统内存充足,垃圾回收器不会立即回收对象。强引用使得对象在被引用时一直保持有效,直到引用被显式解除。

2. 软引用(Soft Reference):

  • 定义: 软引用用于描述一些还有用但并非必须的对象,在内存不足时可能被垃圾回收。
  • 示例代码:
    import java.lang.ref.SoftReference;public class SoftReferenceExample {public static void main(String[] args) {// 创建一个大对象byte[] largeObject = new byte[10 * 1024 * 1024]; // 10MB// 使用软引用关联这个大对象SoftReference<byte[]> softReference = new SoftReference<>(largeObject);// 大对象不再被强引用,但仍然被软引用关联// 尝试获取软引用关联的对象byte[] retrievedObject = softReference.get();if (retrievedObject != null) {System.out.println("对象仍然存在,无需重新创建。");} else {System.out.println("对象已被回收,需要重新创建。");}}
    }

    在这个例子中,创建了一个10MB大小的大对象,并使用软引用SoftReference与之关联。然后,尝试通过软引用获取对象。如果内存足够,对象就会保留;如果内存不足,垃圾回收器可能会回收该对象。这样,软引用允许在内存不足时释放一些非必要的对象,从而提高系统的内存利用率。

3. 弱引用(Weak Reference):

  • 定义: 弱引用(Weak Reference)是Java中一种比强引用更弱的引用类型。当一个对象只被弱引用关联时,在下一次垃圾回收时,该对象就有可能被回收。垃圾回收器会在适当的时候回收仅被弱引用持有的对象,即使内存并不紧张。
  • 示例代码:
     
    import java.lang.ref.WeakReference;public class WeakReferenceExample {public static void main(String[] args) {// 创建一个对象并建立弱引用Object obj = new Object();WeakReference<Object> weakRef = new WeakReference<>(obj);// 对象仍然存在,可以正常使用System.out.println("Object is still accessible: " + weakRef.get());// 解除对对象的强引用obj = null;// 手动触发垃圾回收System.gc();// 垃圾回收后,对象被回收,弱引用返回nullSystem.out.println("Object after garbage collection: " + weakRef.get());}
    }
    在这个例子中,创建了一个对象并建立了弱引用。解除对对象的强引用后,手动触发垃圾回收。由于只有弱引用关联该对象,垃圾回收器可能会在垃圾回收时回收这个对象。因此,通过弱引用可以更容易地允许对象在合适的时候被回收。

4. 虚引用(Phantom Reference):

  • 定义: 虚引用(Phantom Reference)是Java中最弱的引用类型之一,无法通过引用直接获取到对象实例。虚引用主要用于跟踪对象被垃圾回收的状态。当一个对象只被虚引用关联时,其实际上并不影响对象的生命周期,也就是说,垃圾回收器随时可能回收被虚引用关联的对象。
  • 示例代码:
    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;public class PhantomReferenceExample {public static void main(String[] args) {// 创建一个对象并建立虚引用Object obj = new Object();ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();PhantomReference<Object> phantomRef = new PhantomReference<>(obj, referenceQueue);// 对象实例不能通过虚引用直接获取System.out.println("Object is not accessible: " + phantomRef.get());// 解除对对象的强引用obj = null;// 手动触发垃圾回收System.gc();// 虚引用将被放入引用队列if (referenceQueue.poll() != null) {// 在引用队列中发现引用,表示对象已被垃圾回收System.out.println("Object has been garbage collected.");}}
    }

    在这个例子中,创建了一个对象并建立了虚引用。由于虚引用无法通过get()方法获取对象实例,对象的生命周期不受虚引用的影响。解除对对象的强引用后,手动触发垃圾回收,虚引用将被放入引用队列。通过监测引用队列中是否有引用,可以了解对象是否已被垃圾回收。虚引用主要用于在对象被回收时执行一些清理操作。



http://www.ppmy.cn/devtools/6243.html

相关文章

开源OCR模型对比

引言 目前&#xff0c;开源的项目中有很多 OCR 模型&#xff0c;但是没有一个统一的基准来衡量哪个是更好一些的。 面对这么多的模型&#xff0c;让我们有些不知所措。为此&#xff0c;最近一段时间以来&#xff0c;我一直想要构建这样一个基准&#xff0c;现在来看&#xff0…

【行为型模式】观察者模式

一、观察者模式概述​ 软件系统其实有点类似观察者模式&#xff0c;目的&#xff1a;一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变&#xff0c;他们之间将产生联动。 观察者模式属于对象行为型&#xff1a; 1.定义了对象之间一种一对多的依赖关系&#xff…

aws云靶场和一些杂记

aws靶场 在AWS靶场中&#xff0c;存在三个安全问题&#xff1a;1) 一个S3存储桶政策配置错误&#xff0c;允许公共访问&#xff0c;通过访问特定域名可获取flag。2) SQS消息队列的政策没有限制角色&#xff0c;允许发送和接收消息&#xff0c;通过aws sqs命令行工具的receive-…

机器学习周报第35周SE-LSTM

文章目录 week35 SE-LSTM摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 Savitsky-Golay 滤波器3.2 模型结构——SE-LSTM 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 训练参数4.3.2 数据集4.3.3 实验设置4.3.4 实验结果 5. python环境下基于scipy实现…

李沐47_转置卷积

转置卷积 1.卷积不会增大输入的高宽&#xff0c;要么不变&#xff0c;要么减半 2.转置卷积可以用来增大输入高宽 3.用id卷积卷&#xff0c;增大卷积核的数量可以达到增大特征图的目的 import torch from torch import nn from d2l import torch as d2l输入矩阵X和卷积核矩阵…

利用 Python 开发手机 App 实战

Python语言虽然很万能&#xff0c;但用它来开发app还是显得有点不对路&#xff0c;因此用Python开发的app应当是作为编码练习、或者自娱自乐所用&#xff0c;加上目前这方面的模块还不是特别成熟&#xff0c;bug比较多&#xff0c;总而言之&#xff0c;劝君莫轻入。 准备工作 …

kafka实验部署

一、前期准备 二、kafka实验 在zookeeper后继续进行操作 2.1 为ndoe1、node2、node3作出部署 2.1.1 解压kafka压缩包&#xff08;node1举例&#xff09; 2.1.2 操作 将解压后的kafka移动到kafka&#xff0c;进入到kafka下的config中&#xff0c;复制文件 2.1.2.1 编辑server.pr…

【Qt】探索Qt框架:跨平台GUI开发的利器

文章目录 1. Qt框架概述1.1. Qt框架的优点1.2. Qt框架支持的系统1.3. Qt开发环境 2. 搭建 Qt 开发环境2.1. Qt SDK 的下载和安装2.2. 新建项目: 3. Qt 框架内容简介总结 在当今软件开发领域&#xff0c;跨平台性和用户界面的友好性是至关重要的。而Qt框架作为一款跨平台的C图形…