摘要:弱引用弱引用比软引用更弱,被弱引用关联的对象只能存活到发生下一次垃圾回收之前,也就是说当发生时,无论当前内存是否足够,都会被回收掉。这是最终的状态,不能再变为其它状态。如下图所示对象都是可被回收的。
【干货点】看完该篇文章,就基本可以解答面试热点【谈谈对Java中几种引用的理解】了。
大家都知道我公众号的副业是
所以经常会有朋友找我吹水,最近就说到了一个面试题
谈谈对Java中几种引用的理解。
因此打算以该面试题为例子,写篇文章说说在Java中引用是什么以及怎么用。
【划重点:给你三秒钟时间思考,如果是你,该如何回答面试官的这个问题呢】
【划重点】在Java中引用包括:
FinalReference 强引用
SoftReference 软引用
WeakReference 弱引用
PhantomReference 虚引用
那么为什么会提供这四种引用呢,主要原因有:
方便Jvm进行垃圾回收
方便开发人员使用,开发人员可以灵活的决定某些对象的生命周期
日常开发如何使用学以致用,那么这几个引用在日常中我们如何进行使用呢?
接下来我会给出相关demo!!!
类似于 Object o = new Object() 这类的引用,创建一个对象后,该引用会被保存在JVM栈中,而且只要强引用存在,垃圾回收器就不会回收掉被引用的对象。
日常使用
强引用的例子比比皆是,因为在日常开发中我们是会经常去new一个对象的,而该new出来的对象便是强引用的,也就是说只要该引用存在,垃圾回收器就不会回收掉。
【划重点:JVM怎么知道引用在不在?】
软引用关联的对象,在内存不够的情况下,会把这些软引用关联的对象列入垃圾回收范围中,然后进行回收,也就是说软引用并非是完全安全的,在内存不够的情况下是会被垃圾回收器回收掉的。
给出demo
通过注释便可以知道,我这里实例化了多个大对象,然后放入softReferences数组中,之后便遍历打印出其中的对象的命名,打印结果如下
可以通过结果看出,前面四个对象因为内存不够而被垃圾回收器回收了。
日常使用
在我司的项目中,部分是使用软引用来保存从数据库中取出的数据,具体是做了一个中间层的封装,该中间层的作用就是在get出数据的时候会去判断数据是否为null,如果是为null再次从数据库读取,读取后再放入软引用的集合中,这样的做法是可以避免内存溢出。
WeakReference 弱引用弱引用比软引用更弱,被弱引用关联的对象只能存活到发生下一次垃圾回收之前,也就是说当发生GC时,无论当前内存是否足够,都会被回收掉。
给出demo
代码很简短,就是先构建一个弱引用对象,然后在gc前先打印出来证明它存在过,之后手动调用gc,再次打印,可以看出已经没了。运行结果如下
PhantomReference 虚引用虚引用和上面不同的地方在于,一个对象是否有虚引用的存在,完全不会对其生存时间构成如何影响,并且也无法通过虚引用来获取一个对象的实例,也就是说跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。
那么这样就很容易产生疑问了,虚引用的作用又是什么呢?
作用就是能在这个对象被收集器回收时收到一个系统通知,实现追踪垃圾收集器的回收动作,比如在对象被回收的时候,会调用该对象的finalize方法。
在给出相关demo前,要先介绍一个
ReferenceQueue 引用队列
ReferenceQueue 引用其实也可以归纳为引用中的一员,可以和上述三种引用类型组合使用【软引用、弱引用、虚引用】。
那么它有何作呢?
在创建Reference时,手动将Queue注册到Reference中,而当该Reference所引用的对象被垃圾收集器回收时,JVM会将该Reference放到该队列中,而我们便可以对该队列做些其他业务,相当于一种通知机制。
给出demo
可以从demo中看出队列的用法,运行打印结果如下
我们可以从结果中看到先是从引用中get出来的对象为null,证明上面说的无法通过虚引用来获取一个对象的实例,并且在回收后会被放入队列中。
和Reference相关的概念首先为了方便JVM进行管理,Reference是有状态的,可以分为以下四种状态
active 一般来说内存一开始被分配的状态,而当被引用的对象的可达性发生变化后gc就会将引用放入pending队列并将其状态改为pending状态。
pending 指的是准备要被放进pending队列的对象。
enqueue 指的是对象的内存已经被回收了。
inactive 这是最终的状态,不能再变为其它状态。
JVM怎么知道引用在不在关于JVM怎么知道引用在不在,这就涉及到了JVM的可达性分析算法了
JVM的可达性分析算法的简单思路就是通过一系列GC Roots作为出发点,向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链,即表明从GC Roots到这个对象不可达时,证明此对象不可用,可被回收。如下图所示
对象4、5、6都是可被回收的。
那么问题来了,哪些对象可以作为GC Roots呢?
这里给出几个,如下
虚拟机栈中引用的对象
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈JNI引用的对象
具体的想要深入研究的可以自行百度&谷歌,或者等我后面深入分析。
最后的最后该篇文章基本解答了【谈谈对Java中几种引用的理解】,如果想要更深入的研究,就要从源码入手了解了。
下次遇见这种面试题,基本上就不慌了,因为实际上只要认真看完该篇文章并且记住几个关键的地方,基本上就不会被面试官问倒了,并且该篇文章后面也解答了【JVM怎么知道引用在不在】和【哪些对象可以作为GC Roots】的问题。
公众号主营:服务端编程相关技术解说,具体可以看历史文章。
公众号副业:各种陪聊吹水,包括技术、就业、人生经历、大学生活、内推等等。
欢迎关注,一起侃大山
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77787.html
摘要:总结动态代理的相关原理已经讲解完毕,接下来让我们回答以下几个思考题。 【干货点】 此处是【好好面试】系列文的第12篇文章。文章目标主要是通过原理剖析的方式解答Aop动态代理的面试热点问题,通过一步步提出问题和了解原理的方式,我们可以记得更深更牢,进而解决被面试官卡住喉咙的情况。问题如下 SpringBoot默认代理类型是什么 为什么不用静态代理 JDK动态代理原理 CGLIB动态代理...
摘要:今天就先给大家讲大数据分析工程师。所以你要和我说你在外面培训了个月的大数据分析后,就想做了,那请你再考虑考虑。而他们鼓吹的大数据分析师,其实就是。 showImg(https://segmentfault.com/img/remote/1460000018722710?w=1000&h=750); Overview: 序 基本概念 DS的职能要求 DE的职能要求 总结 一、序 今天...
摘要:基础回答的好百度说实话没想到百度会给我打面试电话,毕竟是,在我心中地位还是很高的。后来第二天就通知我说直接过了,不用二三面了,就这样只面了一面稀里糊涂的过了百度。差不多是这些,因为是米粉所以毫不犹豫的接收了小米,没去百度。 ----------5月5日确认收到阿里offer ----------4月12日昨天阿里HR面完,目前在等结果的阶段,无论结果如何都能接收,作为一名双非学校的本科...
摘要:年求职面经及总结我的求职之路差不多走到尽头了感觉真是精疲力尽了把这大半年的经历和面试总结写下来希望能给和我一样在求职路上煎熬的人一点帮助先说背景微电子科学与工程专业学过两门和相关的课程语言和单片机这个专业的唯一好处就是大部分人并不知道这个专 18年求职面经及总结 我的求职之路差不多走到尽头了,感觉真是精疲力尽了.把这大半年的经历和面试总结写下来,希望能给和我一样在求职路上煎熬的人一点帮...
摘要:年求职面经及总结我的求职之路差不多走到尽头了感觉真是精疲力尽了把这大半年的经历和面试总结写下来希望能给和我一样在求职路上煎熬的人一点帮助先说背景微电子科学与工程专业学过两门和相关的课程语言和单片机这个专业的唯一好处就是大部分人并不知道这个专 18年求职面经及总结 我的求职之路差不多走到尽头了,感觉真是精疲力尽了.把这大半年的经历和面试总结写下来,希望能给和我一样在求职路上煎熬的人一点帮...
阅读 1396·2021-11-24 09:39
阅读 3686·2021-11-24 09:39
阅读 1859·2021-11-16 11:54
阅读 1463·2021-09-30 09:47
阅读 1712·2021-09-26 10:16
阅读 2341·2021-09-22 15:33
阅读 1452·2021-09-14 18:01
阅读 2435·2021-09-07 09:59