引用计数法和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异步之call future
Jun 14 Java/Android
新手入门Jvm-- JVM对象创建与内存分配机制
Jun 18 Java/Android
Java实现多线程聊天室
Jun 26 Java/Android
Java常用工具类汇总 附示例代码
Jun 26 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
java解析XML详解
Jul 09 Java/Android
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
Dec 06 Java/Android
java代码实现空间切割
Jan 18 Java/Android
关于EntityWrapper的in用法
Mar 22 Java/Android
Netty分布式客户端处理接入事件handle源码解析
Mar 25 Java/Android
一文搞懂Java中的注解和反射
Jun 21 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
简单的JS多重继承示例
2008/03/13 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[02:32]DOTA2亚洲邀请赛 C9战队出场宣传片
2015/02/07 DOTA
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
Python玩转Excel的读写改实例
2019/02/22 Python
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
质检部职责
2013/12/28 职场文书
中学家长会邀请函
2014/01/17 职场文书
教师学习培训邀请函
2014/02/04 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
个人借款协议书范本
2014/11/17 职场文书
同学聚会邀请函
2015/01/30 职场文书
2016年母亲节寄语
2015/12/04 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
python opencv人脸识别考勤系统的完整源码
2021/04/26 Python
Python 如何安装Selenium
2021/05/06 Python
TS 类型收窄教程示例详解
2022/09/23 Javascript