16.互联网大厂高频面试题-强弱软虚引用

文章目录

  • 强引用Referrnce
    • 整体架构
    • 强引用(默认支持)
  • 软引用
  • 弱引用
  • 软引用和弱引用的适用场景
  • weakhashmap案例演示和解析
  • 虚引用简介
    • 引用队列
  • ReferenceQueue引用队列简介
  • 虚引用PhantomReference
  • GCRoots和4大引用小总结

强引用Referrnce

在这里插入图片描述
绝大多数情况下用到的是强引用,软引用在缓存场景中出现。
16.互联网大厂高频面试题-强弱软虚引用_第1张图片

整体架构

16.互联网大厂高频面试题-强弱软虚引用_第2张图片
以前我们说的引用就是用到了Reference这一层。他就是强引用。他所在的包是java.lang.ref,如下图:
16.互联网大厂高频面试题-强弱软虚引用_第3张图片

强引用(默认支持)

16.互联网大厂高频面试题-强弱软虚引用_第4张图片
演示案例:
16.互联网大厂高频面试题-强弱软虚引用_第5张图片
运行结果:
在这里插入图片描述

软引用

强引用:死了都不收。软引用:内存足够的情况下,我不收,内存不够的情况下,我要收。
16.互联网大厂高频面试题-强弱软虚引用_第6张图片
代码演示:
16.互联网大厂高频面试题-强弱软虚引用_第7张图片
此时内存是够用的,软引用不会被回收,效果如下:
在这里插入图片描述
为了演示效果(内存不够用时,软引用会被回收),先设置一下jvm参数,改小。

16.互联网大厂高频面试题-强弱软虚引用_第8张图片
运行效果:
16.互联网大厂高频面试题-强弱软虚引用_第9张图片
此时会发现,软引用就被回收了。

弱引用

弱引用:不管内存是否够用,只要触发gc,一定被回收。
在这里插入图片描述
代码示例:
16.互联网大厂高频面试题-强弱软虚引用_第10张图片
运行结果:
16.互联网大厂高频面试题-强弱软虚引用_第11张图片
会发现,内存足够的情况下,发生gc,直接杀掉弱引用对象。

软引用和弱引用的适用场景

假设有个读图片的场景,肯定要用缓存,第一次读的慢,以后就快了。但是图片比文字大,加载到内存空间里面,很容易就满了。
容易触发oom。
16.互联网大厂高频面试题-强弱软虚引用_第12张图片

在这里插入图片描述
在这里插入图片描述
mybatis缓存的部分,大面积的使用了软引用。

weakhashmap案例演示和解析

16.互联网大厂高频面试题-强弱软虚引用_第13张图片
查看你一下api文档,它位于util包:
16.互联网大厂高频面试题-强弱软虚引用_第14张图片
官方介绍
在这里插入图片描述

hashtable实现了map接口,使用“弱key”,map中的entry将会被自动移除当他的key不再被正常的引用之后。对于给定的映射的key,不会像hashmap一样阻止gc对它回收。当一个key被回收之后,键值对就无效了。效果就相当于被从map中移除。
案例解释:

16.互联网大厂高频面试题-强弱软虚引用_第15张图片
这里把key置空,map里面的数据没有影响。是因为底层源码在put的时候,转化为放入了Node对象(含有kv),所以打印是没有问题的。
基于上面的实验,触发gc:
16.互联网大厂高频面试题-强弱软虚引用_第16张图片
运行结果如下:数据还在。这种情况下,map里面的数据是强引用,不会被回收的。
16.互联网大厂高频面试题-强弱软虚引用_第17张图片
同样的方法,再测试一下弱hashmap,代码如下:
16.互联网大厂高频面试题-强弱软虚引用_第18张图片
运行结果:
在这里插入图片描述
因为是弱引用:只要触发gc就回收,所以最后打印结果就没了。发生oom的概率会大大降低。
这种类方便我们做高速缓存和对内存敏感的业务场景。

虚引用简介

虚引用又称为幽灵引用。
16.互联网大厂高频面试题-强弱软虚引用_第19张图片
在这里插入图片描述

类继承结构图:
16.互联网大厂高频面试题-强弱软虚引用_第20张图片
在这里插入图片描述

引用队列

16.互联网大厂高频面试题-强弱软虚引用_第21张图片

虚引用被回收之前,要被引用队列保存一下。

ReferenceQueue引用队列简介

代码示例:
16.互联网大厂高频面试题-强弱软虚引用_第22张图片
运行结果:
16.互联网大厂高频面试题-强弱软虚引用_第23张图片
gc之前没有,gc之后反而进了队列了。
虚引用被回收之前,要被引用队列保存一下。利用这个api,weakreference也可以。

虚引用PhantomReference

虚引用是监控一个对象的回收信息,然后回收之前把他放到referencequeue中保存一下。类似spring aop的后置通知。
看下面代码就可以明白:
在这里插入图片描述
打印查看回收情况:
16.互联网大厂高频面试题-强弱软虚引用_第24张图片

gc之前,虚引用每次get都是null,gc之后,get还是null,但是就被放到引用队列里面了。

总结:
16.互联网大厂高频面试题-强弱软虚引用_第25张图片

最重要的作用也就是监控对象回收,别的感觉没啥用处。

GCRoots和4大引用小总结

16.互联网大厂高频面试题-强弱软虚引用_第26张图片
可以进入gcroot 集合的对象:
16.互联网大厂高频面试题-强弱软虚引用_第27张图片

你可能感兴趣的:(面试题视频笔记)