引用计数法和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中的static关键字
Jun 14 Java/Android
SpringBoot集成Redis,并自定义对象序列化操作
Jun 22 Java/Android
Java并发编程之详解CyclicBarrier线程同步
Jun 23 Java/Android
Spring Boot 实现敏感词及特殊字符过滤处理
Jun 29 Java/Android
springboot layui hutool Excel导入的实现
Mar 31 Java/Android
Java 超详细讲解ThreadLocal类的使用
Apr 07 Java/Android
SpringCloud Function SpEL注入漏洞分析及环境搭建
Apr 08 Java/Android
零基础学java之方法的定义与调用详解
Apr 10 Java/Android
Java Spring Boot 正确读取配置文件中的属性的值
Apr 20 Java/Android
java版 简单三子棋游戏
May 04 Java/Android
详解Spring Bean的配置方式与实例化
Jun 10 Java/Android
SpringBoot Http远程调用的方法
Aug 14 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
PHP chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
百度留言本js 大家可以参考下
2009/10/13 Javascript
CCPry JS类库 代码
2009/10/30 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
JavaScript实现文本框中默认显示背景图片在获得焦点后消失的方法
2015/07/01 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
JS html时钟制作代码分享
2017/03/03 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
2018/01/26 Javascript
js将键值对字符串转为json字符串的方法
2018/03/30 Javascript
基于Vue的侧边目录组件的实现
2020/02/05 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
Python实现partial改变方法默认参数
2014/08/18 Python
浅析Python中signal包的使用
2015/11/13 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Python生成rsa密钥对操作示例
2019/04/26 Python
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
幼儿园清明节活动总结
2014/07/04 职场文书
工作作风承诺书
2014/08/30 职场文书
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
化妆品促销活动总结
2015/05/07 职场文书
圣诞晚会主持词
2015/07/01 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers