Springboot中强引用&软引用&弱引用&幻象引用(虚引用)的使用详解

作者&投稿:东匡 (若有异议请与网页底部的电邮联系)
~ 概念介绍

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

01.强引用

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

02.软引用

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

比如:

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

03.弱引用

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

比如:

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

04.虚引用

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

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

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

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

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

如图:

强可达:比如创建一个对象时,创建它的线程对该对象就是强可达

软可达:只能通过软引用访问

弱可达:只能通过弱引用访问

虚可达:当对象没有强,软,弱引用关联时,并且finalize过,就会进入该状态

不可达:意味着该对象可以被清除了。

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

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

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

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

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

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

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

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

再记录下这个点?(哈哈不知道啥时候才会用上~)

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

Springboot源码中的使用

嘿嘿终于来到重点了,正如开头提到的~4ye也是在Springboot源码中看到这个ConcurrentReferenceHashMap才想起要写一下这篇文章滴?

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

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

默认情况下是软引用级别

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

源码如下:

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

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

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

总结

看完上面的例子,觉得可以模仿下Springboot的ConcurrentReferenceHashMap,对对象进行一个合理的存储,间接地优化jvm,提高垃圾回收的效率。

这两个别搞混了:软引用,内存不足时回收;弱引用,在进行垃圾回收时,不管内存足与否,都会被回收。

作者:4ye酱




springboot自动配置原理
springboot自动配置原理是基于条件判断来配置Bean。pring Boot的自动配置原理是基于Spring框架的条件化配置(Conditional Configuration)机制实现的。在Spring Boot中,自动配置类都是使用@Configuration注解标注的Java配置类,并且使用了多种条件注解来控制自动配置的条件和范围。当指定的类在类路径中存在时,才会...

spring框架和springboot(spring框架和springmvc框架)
SpringBoot只需要添加spring-boot-starter-security即可(这个依赖中包含spring-security-web和spring-security-config) SpringBoot只使用Servlet3特性来引导应用程序 SpringBoot应用程序的入口点是用@SpringBootApplication: 默认情况下,SpringBoot使用嵌入式容器运行应用程序。在本例中,SpringBoot使用publicstaticvoidmain启动...

做网站BS框架和springnoot框架哪个入手快
springnoot入手快。SpringBoot是BS开发框架之一,不用单独开启tomcat服务器,目前比较流行,一般开发大型项目时会将所有的功能细分为许多小模块,每个模块都有dto、dao、service和controlleer层,有些模块还会加入。validate层。pringBoot是Spring开源组织下的一个子项目,也是Spring组件一站式解决方案,主要是为...

springboot和springcloud哪个先学
springboot。是springcloud的基础,先学习springboot后学习springCloud,pringBoot框架和SpringCloud框架比较,市场上使用Spring底层的基本是使用SpringBoot或者SpringCloud,他们均集成了spring。

spring boot driver does not support get\/ set network timeout fo...
Driver does not support get\/set network timeout for connections错误的原因:pringboot 2.x默认的数据源变成了HikariPool了,弄了一个demo在使用数据源的时候系统报错 HikariPool-1 - Driver does not support get\/set network timeout for connections. (null)。具体的解决办法:通过源码排查到连接...

java系统架构有哪些apache
_SpringBoot框架。 SpringBoot是Spring开源组织下的一个子项目,也是Spring组件的一站式解决方案,主要是为了简化使用Spring的框架难度。?_摹CloudSpring。_馐且幌盗锌蚣艿挠行蚣希悄壳白钊让诺奈⒎窨蚣艿氖籽 J紫龋_pringBoot开发的便利性,巧妙地简化了分布式系统基础的开发,如服务发现注册、配置中心...

SpringBoot系列:springdevtools模块
spring-boot-devtools是Spring Boot给开发人员提供的一个工具包,它可以提高开发人员的工作效率。我们可以通过如下方式引入该工具包:Maven Gradle 有些SpringBoot支持的库使用了缓存技术来提高性能。比如模板引擎会对编译好的模板进行缓存从而避免每次都要解析模板文件;Spring MVC也会为静态文件缓存一些Http的...

spring boot springapplicationbuilder configure怎么不调用_百度知 ...
Spring Boot具有如下特性:为基于Spring的开发提供更快的入门体验 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求。提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等。Spring Boot并不是不对Spring功能上的增强,而是提供了一种...

网吧的电脑无盘系统究竟该怎么搞?300台左右的电脑,对服务器和交换机以及...
boot下的config.sys和autoexec.bat),必须由我们自己来写。当然,要是你发 现了这两个文件,那就省掉如下的步骤了。 config.sys: DEVICE=HIMEM.SYS device=emm386.exe ram DEVICE=ramdrive.sys 1440 \/e dos=umb high autoexec.bat: @if not exist d:\\winboot\\nul mkdir d:\\winboot copy c:\\system.dat ...

spring是做什么的?怎么用?
spring使用方法 1.下载源码 spring-framework-3.2.5.RELEASE Spring必须要引入的jar文件有5个,分别是:commons-logging-1.1.3.jar 日志管理 spring-beans-3.2.5.RELEASE.jar bean节点 spring-context-3.2.5.RELEASE.jar spring上下文节点 spring-core-3.2.5.RELEASE.jar spring核心功能 pring-...

台儿庄区13237963143: spring - boot怎么配置web.xml中的内容 -
以咳溶菌: Spring分为多个文件进行分别的配置,其中在servlet-name中如果没有指定init-param属性,那么系统自动寻找的spring配置文件为[servlet-name]-servlet.xml.当需要载入多个spring相关的配置文件时,首先加载ContextLoaderListener类,再指定context-param中指定多个spring配置文件,使用逗号分别隔开各个文件.为了使用方便可以将配置文件进行MVC式的分解,配置控制器Bean的配置文件放置在一个xml文件中,server的Bean放在service.xml文件中.

台儿庄区13237963143: mysql+springboot+jpa查询几十万条数据很慢 如何解决? -
以咳溶菌: 将查询语句放到服务器命令行去跑,如果慢,则可以考虑通过添加索引来提高查询速度.如已有索引或添加索引后查询速度仍未改善,查看语句执行计划中,是全表扫描还是走索引.如果走了索引,那就可能考虑是服务器性能瓶颈或数据库设置...

台儿庄区13237963143: SpringBoot自动装配原理是什么? -
以咳溶菌: 这个问题是我培训结束后找工作的必问问题: (1)引导类上开启@EnableAutoConfiguration (2)内部通过@import注解引入ImporttSelector (3)查找工程jar包中META-INF/spring.factories文件 (4)装载内部的对象到容器 经过在传智播客的半年集中式学习从小白也能到大牛了,哈哈.

台儿庄区13237963143: idea配置springboot怎么勾选 -
以咳溶菌: 方法/步骤打开IntelliJ IDEA,在菜单栏选择File菜单-->New-->Project...-->Spring Initializr,Project SDK即选择JDK的版本,Choose Initializer Service URL选择Default:http://start.spring.io.在接下来的页面我们创建一个Maven项目,如果有朋友对...

台儿庄区13237963143: spring boot main怎么理解 -
以咳溶菌: 你的系统应该是用的盗版的或者是GOST..由于GOST系统由于修改了引导区的一些文件,会被NOD32以及卡巴斯基误认为是TSR主引导区病毒,放心,无视即可,因为这种属于化石病毒,几乎绝迹了已经.如果觉得碍事,在设置里,取消对主引导区的扫描,就不会有弹窗了

台儿庄区13237963143: springboot matchifmissing表示什么意思 -
以咳溶菌: prefix = "hello", value = "enabled", matchIfMissing = true, matchIfMissing =true意思就是enabled这个属性,如果miss了(也就是在自动配置的bean中),就去properties或者yml文件中去找,不强制;反之如果为false,那么自动配置的bean中则必须有enabled这个属性,不然就会报错.不信你可以去程序中试试,老铁

台儿庄区13237963143: 以下是两个源程序文件: /* m1.c */ /* m2.c */ int p1(viod); static int mai...
以咳溶菌: 1、属性配置文件(application.properties) spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver12341234如...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网