首页 > 编程语言 >Java对象的四种引用

Java对象的四种引用

时间:2024-09-04 14:14:02浏览次数:12  
标签:obj Reference 对象 Object 回收 引用 Java 四种

在 Java 中,对象的引用管理可以通过四种不同的引用类型来实现,这些引用类型提供了不同程度的内存回收控制。这些引用类型分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。每种引用类型都有其特定的应用场景,下面详细介绍每一种引用类型的特点和用途。

1. 强引用(Strong Reference)

强引用是最常用的引用类型。如果一个对象有一个强引用指向它,那么垃圾回收器不会回收这个对象,即使系统内存不足。只要强引用存在,对象就不会被回收。

特点

  • 不会被垃圾回收器回收。
  • 最常用和最安全的引用类型。
  • 如果一个对象具有强引用,那么这个对象在 JVM 生命周期内都是可用的。

示例

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

2. 软引用(Soft Reference)

软引用用于描述还有用但非必需的对象。如果内存足够,软引用的对象不会被垃圾回收器回收。只有在内存不足时,软引用的对象才会被回收,以便释放更多的空间给强引用的对象。

特点

  • 当内存不足时,软引用的对象可以被垃圾回收器回收。
  • 通常用于实现内存敏感的缓存。

示例

import java.lang.ref.SoftReference;

Object obj = new Object();
SoftReference<Object> softRef = new SoftReference<>(obj);
obj = null; // 允许软引用独立存在

// 检查软引用是否仍然有效
if (softRef.get() != null) {
    System.out.println("Soft reference still valid.");
} else {
    System.out.println("Soft reference cleared.");
}

3. 弱引用(Weak Reference)

弱引用比软引用更弱一些,它描述非必需的对象。在垃圾回收器进行清理时,无论系统内存是否充足,都会回收弱引用的对象。也就是说,一旦不再有强引用指向一个对象,那么这个对象的弱引用就会被垃圾回收器回收。

特点

  • 在下一次垃圾回收时,弱引用的对象就会被回收。
  • 通常用于实现快速失效的缓存。

示例

import java.lang.ref.WeakReference;

Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
obj = null; // 允许弱引用独立存在

// 检查弱引用是否仍然有效
if (weakRef.get() != null) {
    System.out.println("Weak reference still valid.");
} else {
    System.out.println("Weak reference cleared.");
}

4. 虚引用(Phantom Reference)

虚引用也称为幽灵引用或幻影引用,是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象实例。为一个对象设置虚引用关联的唯一目的是能在这个对象被收集器回收时收到一个系统通知。

特点

  • 虚引用无法通过虚引用获得对象实例。
  • 主要用于对象被垃圾回收器回收时进行一些清理工作。
  • 必须注册到一个引用队列中,以便在对象被回收时收到通知。

示例

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

Object obj = new Object();
ReferenceQueue<Object> queue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);
obj = null; // 允许虚引用独立存在

// 检查虚引用是否已经被加入到引用队列
Reference<? extends Object> ref = queue.poll();
if (ref == null) {
    System.out.println("Phantom reference not yet cleared.");
} else {
    System.out.println("Phantom reference cleared.");
}

应用场景

  • 强引用:用于大多数普通对象的引用,确保对象在生命周期内一直可用。
  • 软引用:用于实现内存敏感的缓存,当内存不足时可以释放软引用的对象。
  • 弱引用:用于实现快速失效的缓存,不需要时可以快速回收。
  • 虚引用:用于跟踪对象的回收状态,通常用于实现一些清理逻辑,如资源释放等。

通过使用不同类型的引用,开发者可以根据应用程序的需求灵活地管理对象的生命周期和内存使用。如果还有其他具体需求或问题,请继续提问!

标签:obj,Reference,对象,Object,回收,引用,Java,四种
From: https://www.cnblogs.com/firsthelloworld/p/18396349

相关文章

  • android java BufferedWriter writer 需要关闭资源吗?
    在Android开发中,使用Java的`BufferedWriter`或其他类似的I/O资源时,**确实需要关闭资源**。这是因为:1.**释放系统资源**:关闭`BufferedWriter`会释放与之关联的底层资源,如文件句柄。2.**保证数据完整性**:确保所有写入操作完成并刷新缓冲区,这样数据才能被完整地写入到文件中。......
  • 【Java基础】填空题
    这个系列主要是对历年的考试题目中容易模糊的点进行汇总,其中很多内容也附带的了解析。这个系列的所有内容应该是全网最详细的内容了,希望可以帮助大家考试顺利。2024-042023-102023-042022-102022-042021-102021-042020-102020-082019-102019-04求三连!!感谢~~......
  • java+vue计算机毕设中小学家校联系系统的设计与实现【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和教育改革的不断深入,家校联系作为教育过程中不可或缺的一环,其形式与效率正经历着前所未有的变革。传统家校沟通方式,如家长会......
  • java+vue计算机毕设自助料理网上订餐系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的飞速发展和人们生活节奏的加快,线上订餐服务已成为现代都市人不可或缺的生活方式之一。传统餐饮行业面临着转型升级的迫切需求,而自助料理......
  • java+vue计算机毕设心理健康管理系统【源码+开题+论文】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代社会的快速发展,生活节奏日益加快,人们面临的压力与挑战也愈发复杂多样。心理健康问题逐渐成为影响个体生活质量和社会稳定的重要因素。然而,传......
  • 基于Java+SpringBoot+Mysql在线众筹系统功能设计与实现五
    一、前言介绍:1.1项目摘要随着互联网的普及和人们消费观念的转变,众筹作为一种创新的融资方式,逐渐受到社会各界的关注和青睐。它打破了传统融资模式的限制,为初创企业、艺术家、公益项目等提供了更为灵活和便捷的融资渠道。因此,开发众筹系统旨在满足这一市场需求,促进创新项......
  • 基于Java+SpringBoot+Mysql在线众筹系统功能设计与实现六
    一、前言介绍:1.1项目摘要随着互联网的普及和人们消费观念的转变,众筹作为一种创新的融资方式,逐渐受到社会各界的关注和青睐。它打破了传统融资模式的限制,为初创企业、艺术家、公益项目等提供了更为灵活和便捷的融资渠道。因此,开发众筹系统旨在满足这一市场需求,促进创新项......
  • 基于Java+SpringBoot+Mysql在线聊天系统功能设计与实现一
    一、前言介绍:1.1项目摘要随着互联网技术的飞速发展,人们的社交需求日益多样化。传统的面对面交流方式已经无法满足现代人随时随地沟通的需求。因此,开发一个高效、便捷的在线聊天系统成为了满足人们社交需求的重要途径。随着即时通讯技术的不断成熟,如WebSocket、HTTP/2等协......
  • javascript网页设计案例,非常详细
    这里我将为你提供一个详细的JavaScript网页设计案例。我们将创建一个简单的动态网页,包含一个可以显示当前时间的时钟和一个可以切换背景颜色的按钮。1.HTML部分首先,我们需要创建一个HTML文件来定义网页的基本结构。<!DOCTYPEhtml><htmllang="zh-cn"><head>  <met......
  • Java开发
    总结java开发中知识点和问题点基础:    常用加解密算法:[md5]importjava.security.MessageDigest;publicstaticfinalStringencodeMD5(Stringstr){finalbytem=15;char[]cArr={'0','1','2','3','4�......