java中的引用

2023-05-16

背景

最近在研究ThreadLocal中发现最终存储的ThreadLocalMap中的key为弱引用,因此来分析下使用弱引用的原因

实验

引用链为

 //list =>> person1

因此在GC的时候 list还强引用三个对象,导致三个person不会被gc释放掉

    @Test
    public void test2() {
        //list =>> person1
        Person person1 = new Person();
        List<Person> list = new ArrayList<>();
        list.add(person1);
        person1=null;
        System.gc();
        System.out.println(list);
    }

使用弱引用
弱引用当GC时候如果不存在强引用那么就被释放
以下代码调用链路为

list ===>> WeakReference ===>> person1

结果:在这里插入图片描述
最终效果 person1被释放掉了

jvm在GCRoot查询的时候查询到WeakReference则就不会在向下扫描里面的Referent所以导致Referent无引用就被释放调了

注意 new Person()实在堆中的 只剩 WeakReference在引用才会被GC释放,如果还包含强引用,则以强引用为主

在这里插入图片描述

    @Test
    public void test() {
        Person person1 = new Person();
 
        //list ===>> WeakReference ===>> person1
        List<WeakReference<Person>> list = new ArrayList<>();
        list.add(new WeakReference<>(person1));
        person1=null;
        System.gc();
        System.out.println(list);
    	//结果person会被释放
    }

总结

个人理解
每种引用中都包含Reference栈指针

引用描述使用场景
强引用直接new出来的对象,只有在没有被引用才会释放常规的new对象
软引用通过SoftReference创建出来的对象里面包含Reference指向的堆,只有内存在不足GC时候释放Reference指向的的堆内存原有对象一般用来做缓存
弱引用通过WeakReference创建出来的对象里面包含Reference指向的堆,在GC释放会释放Reference指向的的堆内存有ThreadLocal中map的key为弱引用来方式内存泄露(不过个人感觉意义不大,必经大部分使用ThreadLocal的场景都是静态的)
虚引用通过PhantomReference创建,必须和引用队列一起使用(ReferenceQueue),如果一个对象仅有虚引用那么他可以在任何地方释放,并把释放的对象加到队列中一般使用它的继承类Cleaner来做对象释放后的清理工作如NIO中的堆外内存采用的就是虚引用来释放内存

参考文章:

  1. 引用介绍
  2. ThreadLocal源码解析
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的引用 的相关文章

随机推荐

  • 安装spinningup填坑ERROR: Could not build wheels for mpi4py which use PEP 517

    深度强化学习教程 xff1a Spinning Up项目中文版 Spinning Up 文档 ERROR Failed building wheel for mpi4py Failed to build mpi4py ERROR Could
  • MarkDown插入图片调整大小

    一定要注意修改格式的时候要加空格 xff0c 例如 Alt https avatar csdn net 7 7 B 1 ralf hx163com jpg 61 100x jpg和 61 之间的空格不能没有 具体参照 xff1a https
  • Linux初学记录

    编写一个名为iffile程序 xff0c 它执行时判断 bin目录下date文件是否存在 xff1f bin bash fname 61 bin date if test f fname then echo exist fi 123456
  • tensorflow的奇妙下划线,形如(_,变量)变量命名操作的解释

    问题的发现 今天在尝试实现 深度学习之TensorFlow入门 原理与进阶实战 的时候书写了一段代码 xff0c 其中有一行代码我甚是纠结了半天 xff0c 代码如下 xff1a span class token punctuation s
  • zynq实现视频动态字符叠加OSD,提供2套工程源码和技术支持

    目录 1 网上同行的OSD方案 太low 2 本方案OSD的优势3 HLS实现方案4 OSD延时和资源占用情况5 工程1 xff1a zynq7100实现字符叠加6 上板调试验证7 福利 xff1a 工程源码获取 1 网上同行的OSD方案
  • 向日葵连接已断开的解决办法

    方法一 打开ubuntu系统的终端 xff0c 依次输入如下命令 xff1a sudo apt get update sudo apt get upgrade sudo apt install lightdm 重启电脑 方法二 xff08
  • UDP传输图片(分包)

    前提 xff1a 需要了解QUdp的简单通信 xff0c 比如收发个字符串 QP ixmap图片类 xff0c 以此类来加载图片 Q B uffer和Q B yteArray来记录数据 memcpy函数的用法 分包概念 xff1a 举个例子
  • 结构型设计模式(七种)

    3 结构型设计模式 结构型模式描述如何将类或对象按某种布局组成更大的结构 它分为类结构型模式和对象结构型模式 xff0c 前者采用继承机制来组织接口和类 xff0c 后者采用组合或聚合组合对象 由于组合关系或聚合关系比较继承关系耦合度低 x
  • IDEA+Log4j2 设置控制台打印彩色日志

    在Log4j 2 10以前的版本 xff0c pattern中配置 highlight属性是可以正常打印彩色日志的 例如 xff1a pattern 34 d yyyy MM dd HH mm ss SSS highlight 5level
  • weex打包安卓艰苦之路

    weex打包安卓 一 配置安卓环境 下载安卓SDK配置ANDROID HOME配置 ANDROID HOME tools android h 检查是否配置成功 二 weex的安装使用 一 weex简介以及开发前提 1 简介 官网的解释为We
  • docker命令

    Docker命令详解 语法 docker run OPTIONS IMAGE COMMAND ARG Usage Run a command in a new container 中文意思为 xff1a 通过run命令创建一个新的容器 xf
  • PX4 mixer load

    mixer load dev pwm output0 fs microsd mixer ttt mix 启动一个自定义的mixer 系统默认从 etc mixers加载mixer 如果在 fs microsd etc mixers有相同名称
  • Bean三级缓存

    一 核心步骤 提前引用进行动态代理 后置处理器进行动态代理 二 具体步骤 1 获取bean AbstractBeanFactory doGetBean 2 第一次去单例池查询bean 最终调用 xff1a DefaultSingletonB
  • MinIO Client客户端使用

    安装 文档地址 xff1a https docs min io 基本上MinIO服务器和客户端支持在很多系统上安装 xff0c 比如Windows macOS等 xff0c 这里主要说Linux系统 minio安装 span class t
  • Security+Thymeleaf整合

    文章目录 1 版本介绍2 演示demo3 常见使用表达式Using the expression utility objectsUsing the attributes 官方地址 1 版本介绍 2 演示demo html界面 span cl
  • java正则的使用

    java util regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包 它包括两个类 xff1a Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式 Matcher 一个
  • cas服务端动态servers

    一 什么是servers cas的分为服务端和客户端 xff0c 如果客户端要使用cas需要把自己的域名或ip注册到cas服务端才可以使用 默认的servers为静态的 src main resources services HTTPSan
  • cas 配置相关

    默认配置 span class token comment span span class token comment CAS Cloud Bus Configuration span span class token comment sp
  • Elasticsearch分词器

    内置分词器 中文分词器 这篇博客主要讲 xff1a 分词器概念 ES内置分词器 ES中文分词器 一 分词器概念 1 Analysis 和 Analyzer Analysis xff1a 文本分析是把全文本转换一系列单词 term token
  • java中的引用

    背景 最近在研究ThreadLocal中发现最终存储的ThreadLocalMap中的key为弱引用 xff0c 因此来分析下使用弱引用的原因 实验 引用链为 list 61 gt gt person1 因此在GC的时候 list还强引用三