首页 > 编程语言 >Java 中什么是弱引用

Java 中什么是弱引用

时间:2024-04-24 16:15:30浏览次数:19  
标签:Java 对象 什么 System 回收 引用 垃圾

java 弱引用对象被回收后,弱引用会变为null吗

会。对象被回收后,空间会被回收,给空间地址分配的地址也会被回收,其引用都变成了null。

什么是弱引用
弱引用(Weak Reference)是一种特殊的引用关系,在计算机程序设计中,与强引用相对。弱引用的主要特点是它不能确保其引用的对象不会被垃圾回收器回收。如果一个对象只被弱引用所引用,那么该对象会被认为是不可访问(或弱可访问)的,因此它可能在任何时刻被垃圾回收器回收。

弱引用的存在不会影响对象的回收。只要垃圾回收机制运行,无论内存空间是否足够,都会回收被弱引用关联的对象。这种机制允许对象在适当的时机被垃圾回收,从而避免内存泄漏。当内存不足时,JVM(Java虚拟机)会优先回收被弱引用关联的对象。此外,弱引用还可以用于实现缓存,当内存不足时,缓存的对象可以被回收。

需要注意的是,弱引用不会增加对象的引用计数。在Java中,弱引用是为了区别直接的对象引用而定义的另一种引用关系。当对象被除弱引用对象之外的所有对象解除引用后,该对象便可以被垃圾回收器回收。在被对象回收之后,弱引用实例试图访问该对象时,程序会返回null。

总的来说,弱引用是一种用于管理内存和资源的重要机制,它允许程序在适当的时候释放不再需要的对象,从而避免内存泄漏和数据损坏的可能性。一些配有垃圾回收机制的语言,如Java、C#、Python、Perl、Lisp等,都在不同程度上支持弱引用。

Java中弱引用的代码示例

在Java中,弱引用可以通过java.lang.ref.WeakReference类来实现。下面是一个简单的Java代码示例,展示了如何使用弱引用来创建一个对象,并观察当内存压力增大时,该对象如何被垃圾回收器回收

import java.lang.ref.WeakReference;

public class WeakReferenceExample {
    private static final int MEGA_BYTE = 1024 * 1024;

    public static void main(String[] args) {
        // 创建一个强引用对象
        Object strongReferenceObject = new Object();
        System.out.println("Strong Reference Object: " + strongReferenceObject);

        // 创建一个弱引用对象,指向同一个对象
        WeakReference<Object> weakReference = new WeakReference<>(strongReferenceObject);
        System.out.println("Weak Reference Object: " + weakReference.get());

        // 尝试通过弱引用来获取对象
        Object weakReferenceGetObject = weakReference.get();
        System.out.println("Object retrieved through weak reference: " + weakReferenceGetObject);

        // 清理强引用对象,此时只剩弱引用指向该对象
        strongReferenceObject = null;
        System.gc(); // 提示JVM进行垃圾回收,但不保证一定会执行

        // 模拟内存压力,分配大量内存
        byte[] memoryLoad = new byte[MEGA_BYTE * 5];
        System.out.println("Memory load created: " + memoryLoad.length / MEGA_BYTE + "MB");

        // 再次尝试通过弱引用来获取对象
        weakReferenceGetObject = weakReference.get();
        if (weakReferenceGetObject == null) {
            System.out.println("The object has been collected by the garbage collector.");
        } else {
            System.out.println("The object is still reachable through the weak reference.");
        }
    }
}

在这个示例中,我们首先创建了一个强引用对象strongReferenceObject,然后创建了一个指向同一个对象的弱引用weakReference。当我们将强引用设置为null并调用System.gc()来提示JVM进行垃圾回收后,我们尝试通过弱引用来获取对象。由于此时只剩下弱引用指向该对象,且我们模拟了较大的内存压力,所以对象很有可能会被垃圾回收器回收。因此,当我们再次尝试通过弱引用来获取对象时,它可能是null。

需要注意的是,调用System.gc()只是提示JVM进行垃圾回收,但并不能保证垃圾回收器会立即执行。另外,由于JVM的垃圾回收行为是不确定的,因此每次运行此代码时,结果可能会有所不同。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/m0_60521228/article/details/136089640

标签:Java,对象,什么,System,回收,引用,垃圾
From: https://www.cnblogs.com/shijianchuzhenzhi/p/18155677

相关文章

  • Java内部类和常用类
    Java内部类和常用类内部类概念:在一个类的内部在定义一个完整的类,与实例变量,实例方法同级别的类特点:编译后可生成独立的字节码文件内部类可以直接访问外部类的私有成员,而不破坏封装可为外部类提供必要功能组件内部类分类成员内部类静态内部类局部内部类匿名内部......
  • 我为什么学习Rust编程?
    2024-04-24下午,今下午感受到如果要睡觉就应该让音响在自己耳边程序轰炸.翻看gitee,又再次看到这个loop示例,这几天忙于工作,除了偶尔刷下rust视频,rust的电子书,其他的都看得比较少,主要还是感觉工作疲倦之余已经没有精力来继续回顾和延伸.其实后来感觉不是的,就像那会儿接......
  • 解决 java 实体中用 LocalDateTime 在转换时候报错 Error attempting to get column
    java中的实体类用到了LocalDateTime类型。在转换时候报错Errorattemptingtogetcolumn‘XXX’fromresultset.Cause:java.sql.解决方法最为简单。是因为com.alibaba的版本问题。切换版本号到1.1.22即可消除问题<dependency><groupId>com.alibaba</gro......
  • java中的Context
    在java编程中,上下文(Context)是指程序运行时的环境和状态的集合。包括了类对象变量方法等运行时的相关数据在类中,我们可以通过this获取当前类的变量、方法的上下文,例如getset方法:this.val就是获取当前类的上下文。publicclassUser{privateStringname;publicStri......
  • RocketMQ 之 IoT 消息解析:物联网需要什么样的消息技术?
    前言:从初代开源消息队列崛起,到PC互联网、移动互联网爆发式发展,再到如今IoT、云计算、云原生引领了新的技术趋势,消息中间件的发展已经走过了30多个年头。目前,消息中间件在国内许多行业的关键应用中扮演着至关重要的角色。随着数字化转型的深入,客户在使用消息技术的过程中往......
  • jmeter :包含控制器引用外部测试片段
    什么场景适合用测试片段:多人协作接口测试时,每个人负责的模块接口不一样,使用测试片段可以减少脚本重复编写,很好解决模块间脚本依赖问题。1.添加测试片段并保存测试计划:将已调试好的请求和调试取样器放到测试片段(外部测试片段)添加测试片段保存的另一种方法:  按ctrl+选中请求......
  • 【Java注解】自定义注解的简单demo
    需求场景对于特定字段进行脱敏实现步骤首先创建注解@interface1importjava.lang.annotation.ElementType;2importjava.lang.annotation.Retention;3importjava.lang.annotation.RetentionPolicy;4importjava.lang.annotation.Target;56@Retention(Reten......
  • java操作ftp server
    参考:https://www.jianshu.com/p/2efc2669b736POM依赖<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version></dep......
  • 串口服务器和光纤交换机有什么不同
    串口服务器与光纤交换机在功能和应用上存在显著区别。串口服务器主要实现串口设备与以太网设备之间的数据转换与传输,适用于远程监控、数据采集等场景;而光纤交换机则专注于高速光纤网络中的数据交换,为大型企业或数据中心提供稳定、高效的数据传输服务。简而言之,串口服务器侧重串口......
  • 为什么自动驾驶领域发论文都是用强化学习算法,但是实际公司里却没有一家使用强化学习算
    为什么自动驾驶领域发论文都是用强化学习算法,但是实际公司里却没有一家使用强化学习算法?——(特斯拉今年年初宣布推出实际上第一款纯端到端的自动驾驶系统,全部使用强化算法,替换掉原有的30万行C++的rule-based代码)给出一个自己比较认可的答案:https://www.zhihu.com/question/54......