iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >四种引用类型在JAVASpringboot中的使用详解
  • 286
分享到

四种引用类型在JAVASpringboot中的使用详解

2024-04-02 19:04:59 286人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录概念介绍01.  强引用02.  软引用03.  弱引用04.  虚引用对象可达性SpringBoot源码中的使用总结概念介绍 不同的引用类型,主要体现的是对象不同的可达性(r

概念介绍

不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。

01.  强引用

这个就是我们创建的普通对象了~ 当该对象被显示地赋值为 null 时,或者没有被其他存活的对象继续引用时,它就会成为垃圾收集器的目标,等待被收回

02.  软引用

软引用( SoftReference ) , 当内存不足 时会被回收

比如

image-20210620220531336

被回收后,这里会打印 null 而不是 Java4ye

03.  弱引用

弱引用( WeakReference ) , 当 垃圾回收器 进行垃圾回收时,无论内存足与否,它都会被垃圾回收器回收

比如

image-20210620221353830

被回收后,这里也是会打印 null 而不是 Java4ye

04.  虚引用

虚引用( ReferenceQueue ) , 这个也是随时会被回收,不过它的作用更像一个标记,当对象被回收时,它不为 null ,但是要注意,无论什么时候去调用 虚引用的 get 方法,都只能获取到一个 null 值。

为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知 —— <<深入理解Java虚拟机>>

这里引用 Http://www.javashuo.com/article/p-zyvdcbhl-nb.html 该文章的例子


User user = new User(1, "Java4ye");
ReferenceQueue<User> userReferenceQueue = new ReferenceQueue<>();
// 创建User对象的虚引用
PhantomReference<User> phantomReference = new PhantomReference<>(user, userReferenceQueue);
// 去掉强引用
user = null;
System.out.println(phantomReference.get());
// 手动触发GC
System.gc();
System.out.println("GC: " + phantomReference.get());
Reference<? extends User> reference = null;
try {
    reference = userReferenceQueue.remove(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
if (reference != null) {
    System.out.println("对象User被回收了:");
}

对象可达性

那么 简单介绍完上面的 4 种引用后,我们再来看看它的可达性~

如图~

image-20210621083333189

  • 强可达: 比如 创建一个对象时,创建它的线程对该对象就是强可达
  • 软可达: 只能通过软引用访问
  • 弱可达: 只能通过弱引用访问
  • 虚可达: 当对象没有 强,软,弱 引用关联时,并且 finalize 过,就会进入该状态
  • 不可达: 意味着该对象可以被清除了。

通过最开始的代码例子和上面的图(双向箭头)我们还可以发现,软引用和弱引用和强引用这三者间可以进行转换( 通过 Reference 的 get() 可获取到原对象),这意味着:

对于软引用、弱引用之类,垃圾收集器可能会存在二次确认的问题,以保证处于弱引用状态的对象,没有改变为强引用。

在 jdk8 中,还可以通过 指定参数打印引用的相关信息

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC

 JDK8 中使用 ParrallelGC 收集的垃圾回收日志 (大佬 pdf 中的例子)

0.403: [GC (Allocation Failure) 0.871: [SoftReference, 0 refs, 0.0000393 secs]0.871: [WeakReference, 8 refs, 0.0000138 secs]0.871: [FinalReference, 4 refs, 0.0000094 secs]0.871:

[PhantomReference, 0 refs, 0 refs, 0.0000085 secs]0.871: [JNI Weak Reference, 0.0000071 secs][PSYoungGen: 76272K->10720K(141824K)] 128286K->128422K(316928K), 0.4683919 secs] [Times:

user=1.17 sys=0.03, real=0.47 secs]

再记录下这个点?

通过底层api来达到强引用?

image-20210621085544098

springboot源码中的使用

嘿嘿 终于来到重点了 ,正如开头提到的~ 4ye 也是在 Springboot 源码中看到这个

ConcurrentReferenceHashMap 才想起要写一下这篇文章滴✍

那么这个 ConcurrentReferenceHashMap 到底有什么作用呢?

ConcurrentReferenceHashMap 能指定所存放对象的引用级别

默认情况下是 软引用级别

image-20210621122940290

比如 在 Springboot自动装配原理探索 一文中提到的 Springboot SPI 机制 其中的主角: SpringFactoriesLoader

源码如下:

image-20210621092032074

还有自动配置过程中的注解扫描 AnnotationsScanner

image-20210621093124042

以及在 万字长文,带你快速上手这些池化技术! 一文中出现的 异步任务线程池 ThreadPoolTaskExecutor

源码如下: (可以看到这里指明了是 弱引用级别)

image-20210621092723147

总结

看完上面的例子,觉得可以模仿下 Springboot 的 ConcurrentReferenceHashMap ,对对象进行一个合理的存储,间接地优化JVM ,提高垃圾回收的效率。这两个别搞混了: 软引用,内存不足时回收;弱引用,在进行垃圾回收时,不管内存足与否,都会被回收

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 四种引用类型在JAVASpringboot中的使用详解

本文链接: https://www.lsjlt.com/news/134551.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 四种引用类型在JAVASpringboot中的使用详解
    目录概念介绍01.  强引用02.  软引用03.  弱引用04.  虚引用对象可达性Springboot源码中的使用总结概念介绍 不同的引用类型,主要体现的是对象不同的可达性(r...
    99+
    2024-04-02
  • 简述Java中的四种引用类型
    目录简介 强引用 软引用 弱引用 虚引用 简介 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用...
    99+
    2024-04-02
  • Java中四种引用详解
    目录强引用软引用弱引用虚引用总结java 中的 4 种引用方式,适用于不同的场景,重点需要理解虚引用,结合文字和代码 强引用 被强引用的对象,不会被垃圾回收器回收,JVM 宁愿抛出 ...
    99+
    2024-04-02
  • java四种引用类型是什么
    Java中有四种引用类型,它们分别是:1. 强引用(Strong Reference):最常见的引用类型,只要一个对象有强引用与之关...
    99+
    2023-09-28
    java
  • 详解C++中四种类型的转换
    目录const_caststatic_castreinterpret_castdynamic_cast代码C语言中我们使用 int a=(int) b;的方式强制转换 C++提供了四...
    99+
    2022-12-08
    C++类型转换 C++ 类型转换符 C++ 转换符
  • Java的引用类型常用的四种方法
    目录前言强引用FinalReference软引用SoftReference弱引用weakReference虚引用PhantomReference前言 今天看代码看到有牵扯到弱引用的东...
    99+
    2024-04-02
  • Android中深入学习对象的四种引用类型
    目录一、引用详解1、强引用 StrongReference2、弱引用3、软引用4、虚引用前言: Java中,一切被视为对象,引用则是用来操纵对象的;在JDK1.2就把对象引用分为四...
    99+
    2024-04-02
  • C#中的引用类型以及特殊引用类型详解
    基本 哪些属于引用类型 类(object,string),接口、数组、委托 引用类型分配在哪里 引用类型变量位于线程栈。引用类型实例分配在托管堆上。当引用类型实例的大小小于85000...
    99+
    2022-11-13
    C# 引用类型 特殊引用类型
  • C++实例讲解四种类型转换的使用
    目录C++类型转换C语言风格的转换C++风格的类型转换static_castreinterpret_castconst_castdynamic_cast小结C++类型转换 C语言风格...
    99+
    2024-04-02
  • Java中值类型和引用类型详解
    我们都知道java是一种面向对象的编程语言,但是在实际意义上java并不是纯面向对象,因为面向对象的意义就是万物皆对象,那么如果说int类型的变量也是一个对象的话,那么我们应该能用&...
    99+
    2024-04-02
  • 详解Java的引用类型及使用场景
    目录1. 强引用(Strong Reference)2. 软引用(Soft Reference)3. 弱引用(Weak Reference)4. 虚引用(Phantom Refere...
    99+
    2024-04-02
  • Java中的引用类型和使用场景详细
    目录1、强引用2、软引用3、弱引用4、弱引用的使用场景5、虚引用Java中的引用类型有哪几种? Java中的引用类型分成 强引用 , 软引用 , 弱引用 , 虚引用 。 1、强...
    99+
    2024-04-02
  • C++详细讲解引用类型
    目录一、C++中的引用类型二、如何使用C++中的引用类型一、C++中的引用类型 在以严蔚敏老师的《数据结构》为代表的诸多数据结构的书中,都出现了C++引用这一用法,所以在学习数据结构...
    99+
    2024-04-02
  • Java中四种线程池的使用示例详解
    在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大使用线程池的好处: 减少在创建和销毁线程上所花的时间以及系统资源的开销 如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 本文详细的给...
    99+
    2023-05-31
    java 线程池 ava
  • Java中的四种引用是什么
    这篇文章主要讲解了“Java中的四种引用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的四种引用是什么”吧!首先,从 JDK1.2  开始,对象的引用被划分为4种级...
    99+
    2023-06-16
  • C#中如何使用值类型和引用类型
    C#中如何使用值类型和引用类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1。变量:变量是指在程序的运行过程中随时可以发生变化的量。语法:数据类型 变量名2。常量:也称常数,...
    99+
    2023-06-17
  • C#中如何使用引用类型
    C#中如何使用引用类型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先,让我们来看一看值类型(value)(在 C# 中用结构声明)。class t...
    99+
    2023-06-17
  • java8中的四种方法怎么引用
    这篇文章主要介绍“java8中的四种方法怎么引用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java8中的四种方法怎么引用”文章能帮助大家解决问题。1、构造方法引用Test test&n...
    99+
    2023-06-30
  • Redis Stream类型的使用详解
    目录一、背景二、redis中Stream类型的特点三、Stream的结构四、Stream的命令1、XADD 往Stream末尾添加消息1、命令格式2、举例2、XRANGE查看Stre...
    99+
    2024-04-02
  • Oracle数据库中的索引类型及作用详解
    Oracle数据库中的索引类型及作用详解 在Oracle数据库中,索引是一种非常重要的数据结构,用于快速定位和检索数据,提高查询性能。索引可以大大减少查询数据时需要扫描的表的行数,从而...
    99+
    2024-03-10
    作用 索引类型
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作