引用计数法和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 相关文章推荐
详解Java实践之抽象工厂模式
Jun 18 Java/Android
spring项目中切面及AOP的使用方法
Jun 26 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
Java8中接口的新特性使用指南
Nov 01 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
Mar 21 Java/Android
详解Flutter和Dart取消Future的三种方法
Apr 07 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
springcloud整合seata
May 20 Java/Android
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
Jul 15 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
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
2010/09/14 Javascript
javascript验证上传文件的类型限制必须为某些格式
2013/11/14 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
微信小程序实现导航栏选项卡效果
2020/06/19 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
2019/04/16 jQuery
微信小程序 自定义弹窗实现过程(附代码)
2019/12/05 Javascript
跟老齐学Python之画圈还不简单吗?
2014/09/20 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
python将list转为matrix的方法
2018/12/12 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
pandas中的series数据类型详解
2019/07/06 Python
QML实现钟表效果
2020/06/02 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
医药类个人求职的自我评价
2014/02/12 职场文书
三八妇女节趣味活动方案
2014/08/23 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
宇宙与人观后感
2015/06/05 职场文书
死亡诗社观后感
2015/06/05 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技