再谈有关JVM中的四种引用

1.强引用

强引用就是我们平时使用最多的那种引用,就比如以下的代码

//创建一个对象
Object obj = new Object();//强引用

这个例子就是创建了一个对象并建立了强引用,强引用一般就是默认支持的当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会回收对象。即使在解除对对象的强引用后,只要系统内存充足,垃圾回收器不会立即回收对象。强引用使得对象在被引用时一直保持有效,直到引用被显式解除。

以下三种引用就是比较不常见的了,这三种引用虽然叫引用但是和我们理解的那种栈上的变量指向堆上的对象的指针不是一回事。

千万不要将软弱虚这三种引用理解为那种栈上的变量指向堆上的对象的指针。

软引用、弱引用、虚引用:这三种引用其实就是一个个的类,通过对应的类名翻译过来的中文名称。

// 软引用
public class SoftReference<T> extends Reference<T> {

}

// 弱引用
public class WeakReference<T> extends Reference<T> {
  
}

// 虚引用
public class PhantomReference<T> extends Reference<T> {
  
}

 

2.软引用

发生了垃圾回收,并且回收后内存仍然不足,并且被软引用指向的对象没有强引用,那么被软引用指向的对象就会被回收。

public class SoftReferenceDemo {
    public static void main(String[] args) {

        Object a = new Object();
        SoftReference softReference = new SoftReference<>(a);//软引用

        //a和软引用指向同一个对象
        System.out.println(a);//java.lang.Object@4554617c
        System.out.println(softReference.get());//java.lang.Object@4554617c
        
        //内存够用,软引用不会被回收
        a = null;
        System.gc();//内存够用不会自动gc,手动唤醒gc
        System.out.println(a);//null
        System.out.println(softReference.get());//java.lang.Object@4554617c

        //内存不够用时
        try{
        //配置Xms和Xmx为5MB
            byte[] bytes = new byte[1024102430];//设置30MB超内存
        }catch (Throwable e){
            e.printStackTrace();
        }finally {
            System.out.println(a);//null
            System.out.println(softReference.get());//null
        }
    }
}

第一步

第二步撤了对a对象的强引用只剩软引用了,手动唤醒gc对象被清除了

3.弱引用

弱引用(Weak Reference)是Java中一种比强引用更弱的引用类型。当一个对象只被弱引用关联时,在下一次垃圾回收时,该对象就有可能被回收。垃圾回收器会在适当的时候回收仅被弱引用持有的对象,即使内存并不紧张。

public class WeakReferenceDemo {
    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();

        // 垃圾回收后,对象被回收,弱引用返回null
        System.out.println("Object after garbage collection: " + weakRef.get());
    }

}

  • 软引用和弱引用一般都可以被用于实现内存敏感的缓存
  • ThreadLocalMap中的entry实体就是一个弱引用
static class ThreadLocalMap {

      // Entry是一个弱引用
    static class Entry extends WeakReference<ThreadLocal<?>> {
        /** The value associated with this ThreadLocal. */
        Object value;

        Entry(ThreadLocal<?> k, Object v) {
            super(k);
            value = v;
        }
    }
}

为什么要在ThreadLocal中使用弱引用?

先简单说一下在 ThreadLocal 的实现中,它使用了一个名为 ThreadLocalMap 的哈希表来存储每个线程的局部变量。这个 ThreadLocalMap 的键(Key)是 ThreadLocal 对象的弱引用,而值(Value)则是与线程相关联的实际对象。

1.防止内存泄露:使用弱引用允许 JVM 在内存紧张时回收 ThreadLocal 对象,而不必等待整个ThreadLocalMap 被显式清理。这种灵活性有助于更好地管理内存,特别是在高负载或长时间运行的应用程序中。

2.灵活的内存管理:使用弱引用允许 JVM 在内存紧张时回收 ThreadLocal 对象,而不必等待整个 ThreadLocalMap 被显式清理。这种灵活性有助于更好地管理内存,特别是在高负载或长时间运行的应用程序中。

4.虚引用

虚引用(Phantom Reference)是Java中最弱的引用类型之一,无法通过引用直接获取到对象实例。虚引用主要用于跟踪对象被垃圾回收的状态。当一个对象只被虚引用关联时,其实际上并不影响对象的生命周期,也就是说,垃圾回收器随时可能回收被虚引用关联的对象,我们甚至无法通过get方法获取到对象实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/801397.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

新手设计必读:学习五种流行弹窗基本样式

本文将给大家分享弹窗设计的 5 个关键方法是布局合理性、可视化元素、考虑目标受众、避免复杂内容、合理定时触发方式&#xff1b;5个弹窗设计基本样式&#xff0c;分别是电商应用弹窗、简约风格弹窗、红包主题弹窗、可视化按钮弹窗、多款通用 APP 弹窗。 即时设计-可实时协作…

EPLAN 去掉PDF中的红色跳转标识

EPLAN PDF图纸导出后体验跳转标识会有红色标识&#xff0c;如何去掉呢&#xff1f;下面介绍一下方法&#xff1a; 此为现象&#xff1a; EPLAN 2.9的帮助文档里提示&#xff1a; 在导出的 PDF 文档中&#xff0c;跳转后的跳转目标现在通过红色的闪烁框进行标识。可能的跳转目…

ROS2-Navigation2初体验:Gazebo“打不开”

输入ros2 launch nav2_bringup tb3_simulation_launch.py headless:False后只能打开RVIZ而无法打开Gazebo的问题&#xff0c;多次尝试解决后发现只是多等待一会儿即可&#xff0c;在此给同样学习Navigation2的朋友们提个醒 。 Getting Started — Nav2 1.0.0 documentation 1…

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时&#xff0c;从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样&#xff0c;第一个字符不匹配时&#xff0c;只能匹配下一个子串&#xff0c;因此&#xff0c;往后&#xff0c;next[1]都无脑写…

python的日期和时间

时间与日期 基础知识&#xff08;python的时间表示方法&#xff09; 时间戳 时间戳是一个用于表示特定时间点的方式&#xff0c;它表示自1970年1月1日00:00:00 UTC&#xff08;协调世界时&#xff09;以来经过的秒数。时间戳通常用于编程中&#xff0c;因为它提供了一种简单的方…

树结构添加分组,向上向下添加同级,添加子级

树结构添加分组&#xff0c;向上向下添加同级&#xff0c;添加子级 效果代码实现页面js 效果 代码实现 页面 <el-tree :data"treeData" :props"defaultProps" :expand-on-click-node"false":filter-node-method"filterNode" :ref&…

实战:功能强大齐全BBS论坛项目Echo简介

项目简介 Echo 是一套前后端不分离的开源社区系统&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis MySQL Redis Kafka Elasticsearch Spring Security ...&#xff09;&#xff0c;并提供详细的开发文档和配套教程。包含帖子、评论、私信、系…

QT官方modbus_slave例子嵌入到界面

1.打开QT官方modbus_slave的例子 根据提示略微配置一下编译选项&#xff0c;就可以正常运行。 2.新将一个项目包含这个例子 这个例子非常简单&#xff0c;就是在默认的mainwindow上给个按钮&#xff0c;点击按钮调用这个例子的界面。 3.修改*.pro文件 serialport serialbus …

腾讯解禁 QQ 极速版,且看我收集的最全 QQ 各类版本

因为利益关系&#xff0c;腾讯早就限制QQ极速版的登录了&#xff0c;近日居然解除限制了&#xff0c;面对越来越臃肿的QQ&#xff0c;我给大伙准备了几十个版本的QQ&#xff0c;总有一个适合你。 QQ版本合集 给大伙们收集了QQ版本合集&#xff0c;分别有历史版本、精简版本、内…

第59期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

动手学深度学习——3.多层感知机

1.线性模型 线性模型可能出错 例如&#xff0c;线性意味着单调假设&#xff1a; 任何特征的增大都会导致模型输出的增大&#xff08;如果对应的权重为正&#xff09;&#xff0c; 或者导致模型输出的减小&#xff08;如果对应的权重为负&#xff09;。 有时这是有道理的。 例…

【Java--数据结构】队列与栈的相互成就

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 用队列实现栈 用栈实现队列 用队列实现栈 oj链接 一个队列是无法实现栈的 入栈push&#xff1a;把数据放到不为空的队列当中。 注意&#xff1a;第一次入栈时&…

手写new

手写new new是什么执行new会发生什么实现new new是什么 new 操作符是可以创建一个用户定义的对象的实例或具有构造函数的内置对象的实例 function Car (make, model, year) {this.make makethis.model modelthis.year year } Car.prototype.running function () {return …

R语言极值分析:GEV与GPD模型与MCMC的海洋观测数据极值模拟可视化研究

全文链接&#xff1a;https://tecdat.cn/?p37007 原文出处&#xff1a;拓端数据部落公众号 在海洋科学领域&#xff0c;极端天气和海洋事件如极端海浪、风暴潮和海啸等&#xff0c;对沿海社区、基础设施及生态环境构成了重大威胁。准确预测和评估这些极端事件的强度和频率&a…

Golang中读写锁的底层实现

目录 Sync.RWMutex 背景与机制 接口简单介绍 sync.RWMutex 数据结构 读锁流程 RLock RUnlock RWMutex.rUnlockSlow 写锁流程 Lock Unlock Sync.RWMutex 背景与机制 从逻辑上&#xff0c;可以把 RWMutex 理解为一把读锁加一把写锁&#xff1b; 写锁具有严格的排他性&…

Qt程序图标更改以及程序打包

Qt程序图标更改以及程序打包 1 windows1.1 cmake1.1.1 修改.exe程序图标1.1.2 修改显示页面左上角图标 1.2 qmake1.2.1 修改.exe程序图标1.2.2 修改显示页面左上角图标 2 程序打包2.1 MinGW2.2 Visual Studio 3 参考链接 1 windows 1.1 cmake 1.1.1 修改.exe程序图标 获得一个…

【Linux】进程控制的详细介绍

前言 在此之前&#xff0c;我们学过进程的概念&#xff0c;进程的状态&#xff0c;进程地址空间等一系列进程相关的问题。本章我们继续学习进程&#xff0c;我们要来学习一下进程的控制&#xff0c;关于进程等待&#xff0c;等问题。 目录 1.再次认识Fork函数1.1 fork()之后操…

搜集日志。

logstash 负责&#xff1a; 接收数据 input — 解析过滤并转换数据 filter(此插件可选) — 输出数据 output input — decode — filter — encode — output elasticsearch 查询和保存数据 Elasticsearch 去中心化集群 Data node 消耗大量 CPU、内存和 I/O 资源 分担一部分…

数据结构进阶:使用链表实现栈和队列详解与示例(C, C#, C++)

文章目录 1、 栈与队列简介栈&#xff08;Stack&#xff09;队列&#xff08;Queue&#xff09; 2、使用链表实现栈C语言实现C#语言实现C语言实现 3、使用链表实现队列C语言实现C#语言实现C语言实现 4、链表实现栈和队列的性能分析时间复杂度空间复杂度性能特点与其他实现的比较…

启动yarn后,其他节点没有NodeManager

写在前面&#xff1a; 这个问题虽然折磨了我两天&#xff0c;但是原因特别蠢&#xff0c;可能与各位不一定一样&#xff0c;我是因为ResourceManager的节点的"/etc/hadoop/workers"文件没有配置好&#xff08;没有配hadoop102和hadoop104&#xff09;&#xff0c;但排…