引用计数法和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 相关文章推荐
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
Jun 21 Java/Android
探讨Java中的深浅拷贝问题
Jun 26 Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 Java/Android
java固定大小队列的几种实现方式详解
Jul 15 Java/Android
Springboot如何同时装配两个相同类型数据库
Nov 17 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
Java十分钟精通进阶适配器模式
Apr 06 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
Android Canvas绘制文字横纵向对齐
Jun 05 Java/Android
SpringBoot接入钉钉自定义机器人预警通知
Jul 15 Java/Android
HttpClient实现文件上传功能
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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
PHP中创建并处理图象
2006/10/09 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
JS实现分页浏览横向图片(类轮播)实例代码
2017/11/06 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
vue-cli3 热更新配置操作
2020/09/18 Javascript
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python3 能振兴 Python的原因分析
2014/11/28 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
公司人力资源的自我评价
2014/01/02 职场文书
区三好学生主要事迹
2014/01/30 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
留学经费担保书
2014/05/12 职场文书
应聘教师自荐书
2014/06/16 职场文书
学校查摆问题整改措施
2014/09/28 职场文书
2014年环保局工作总结
2014/12/11 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
亲情作文之母爱
2019/09/25 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
CSS极坐标的实例代码
2021/06/03 HTML / CSS
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android