引用计数法和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 相关文章推荐
eclipse创建项目没有dynamic web的解决方法
Jun 24 Java/Android
Java 中的 Unsafe 魔法类的作用大全
Jun 26 Java/Android
Java中常用解析工具jackson及fastjson的使用
Jun 28 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
解决Jenkins集成SonarQube遇到的报错问题
Jul 15 Java/Android
Spring Cloud 中@FeignClient注解中的contextId属性详解
Sep 25 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
mapstruct的用法之qualifiedByName示例详解
Apr 06 Java/Android
Android在Sqlite3中的应用及多线程使用数据库的建议
Apr 24 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
多线程Spring通过@Scheduled实现定时任务
May 25 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
对盗链说再见...
2006/10/09 PHP
PHP中的extract的作用分析
2008/04/09 PHP
Laravel框架实现发送短信验证功能代码
2016/06/06 PHP
js变量以及其作用域详解
2020/07/18 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
在React框架中实现一些AngularJS中ng指令的例子
2016/03/06 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
Vue中多个元素、组件的过渡及列表过渡的方法示例
2019/02/13 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
python动态参数用法实例分析
2015/05/25 Python
Python入门教程之运算符与控制流
2016/08/17 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
python实现输入数字的连续加减方法
2018/06/22 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
学校安全检查制度
2014/01/27 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
公司年会主持词
2014/03/22 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
公司节能减排方案
2014/05/16 职场文书
会计工作能力自我评价
2015/03/05 职场文书
个性与发展自我评价
2015/03/06 职场文书
总结Python常用的魔法方法
2021/05/25 Python
React自定义hook的方法
2022/06/25 Javascript