引用计数法和root搜索算法以及JVM中判定对象需要回收的方法


Posted in Java/Android onApril 19, 2022

引用计数法

每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0,对象就标识可以回收

这个可以用数据算法中的图形表示,对象A-对象B-对象C 都有引用,所以不会被回收,对象B由于没有被引用,没有路径可以达到对象B,对象B的引用计数就就是0,对象B就会被回收。

引用计数法和root搜索算法以及JVM中判定对象需要回收的方法

但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。例如下图:对象A,对象B 循环引用,没有其他的对象引用A和B,则A和B 都不会被回收。

引用计数法和root搜索算法以及JVM中判定对象需要回收的方法

root搜索算法

这种算法目前定义了几个root,也就是这几个对象是jvm虚拟机不会被回收的对象,所以这些对象引用的对象都是在使用中的对象,这些对象未使用的对象就是即将要被回收的对象。简单就是说:如果对象能够达到root,就不会被回收,如果对象不能够达到root,就会被回收。

引用计数法和root搜索算法以及JVM中判定对象需要回收的方法

被启动类(bootstrap加载器)加载的类和创建的对象
jvm运行时方法区类静态变量(static)引用的对象
jvm运行时方法去常量池引用的对象
jvm当前运行线程中的虚拟机栈变量表引用的对象
本地方法栈中(jni)引用的对象

引用计数法和root搜索算法以及JVM中判定对象需要回收的方法

jvm在确定是否回收的对象的时候采用的是root搜索算法来实现。

补充:jvm判断对象的回收

可达性分析算法

可达性分析算法:通过一系列“GC Roots”的根对象作为起始节点集,根据引用关系向下搜索,若某个对象到根对象无任何引用链相连,则此对象不可达。

但是可达性分析后为不可达的对象不是一定要回收,会经历一个二次标记过程。

二次标记

1.如果对象在可达性分析后结果为不可达,则会被第一次标记。接着进行筛选,筛选条件为是否执行finalize()方法。

  • 若该对象未覆盖finalize()方法,或finalize()已被调用过一次,则不需要执行finalize()方法。那么此对象判定为需要回收。

(对象的 finalize()方法只会被系统调用一次,下次回收该对象时, finalize()不会再执行)

  • 若该对象覆盖了finalize()方法,且finalize()方法未被调用过,则需要执行finalize()方法。

2.若该对象需要执行finalize()方法,则该对象会被放置在一个F-Queue的队列中,再由一个finalizer线程执行这些对象的finalize()方法。

3.接着收集器会堆F-Queue队列的对象进行二次标记,若对象在finalize() 方法中未能逃脱,那么该对象会被二次标记,二次标记的对象判定为需要回收;

(对象可以在 finalize()方法中,将自己和引用链上的对象建立引用关系,这样在第二次标记时,收集器会将其移出回收对象的集合,以此达到逃脱)

到此这篇关于jvm中如何判定对象需要回收的文章就介绍到这了!

Java/Android 相关文章推荐
Spring Bean的实例化之属性注入源码剖析过程
Jun 13 Java/Android
JVM入门之类加载与字节码技术(类加载与类的加载器)
Jun 15 Java/Android
springboot集成flyway自动创表的详细配置
Jun 26 Java/Android
解决SpringBoot跨域的三种方式
Jun 26 Java/Android
Java中使用Filter过滤器的方法
Jun 28 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
Lombok的详细使用及优缺点总结
Jul 15 Java/Android
Java使用Unsafe类的示例详解
Sep 25 Java/Android
springboot中rabbitmq实现消息可靠性机制详解
Sep 25 Java/Android
Java对文件的读写操作方法
Apr 29 Java/Android
Spring中bean集合注入的方法详解
Jul 07 Java/Android
一文了解Java动态代理的原理及实现
Jul 07 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 #Java/Android
Android自定义双向滑动控件
Apr 19 #Java/Android
java高级用法JNA强大的Memory和Pointer
Apr 19 #Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 #Java/Android
Java数组详细介绍及相关工具类
Apr 14 #Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 #Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 #Java/Android
You might like
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
php引用传值实例详解学习
2013/11/06 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
2015/12/25 PHP
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
JavaScript实现翻页功能(附效果图)
2017/02/16 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
js实现单张图片平移切换效果
2017/10/11 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python实现点对点聊天程序
2018/07/28 Python
python实现感知器算法(批处理)
2019/01/18 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python之关于类变量的两种赋值区别详解
2020/03/12 Python
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
假日旅行社实习自我鉴定
2013/09/24 职场文书
建筑行业的大学生自我评价
2013/12/08 职场文书
搬家公司的创业计划书
2014/01/01 职场文书
初一英语教学反思
2014/01/11 职场文书
寒假实习自荐信
2014/01/26 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
纠风工作实施方案
2014/03/15 职场文书
食品业务员岗位职责
2014/03/18 职场文书
班级学习计划书
2014/04/27 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
素质教育标语
2014/06/27 职场文书
百日安全生产活动总结
2014/07/05 职场文书
消防演习通知
2015/04/25 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
关于五一放假的通知
2015/08/18 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python
mysql创建存储过程及函数详解
2021/12/04 MySQL
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS