引用计数法和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 16 Java/Android
Java各种比较对象的方式的对比总结
Jun 20 Java/Android
详解Spring Boot使用系统参数表提升系统的灵活性
Jun 30 Java/Android
java基础——多线程
Jul 03 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
Java 超详细讲解设计模式之中的抽象工厂模式
Mar 25 Java/Android
Dubbo+zookeeper搭配分布式服务的过程详解
Apr 03 Java/Android
Java字符缓冲流BufferedWriter
Apr 09 Java/Android
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
Apr 24 Java/Android
Java 多态分析
Apr 26 Java/Android
Spring boot实现上传文件到本地服务器
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开发规范手册之PHP代码规范详解
2011/01/13 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
PHP中图片等比缩放的实例
2013/03/24 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
深入理解JavaScript中Ajax
2016/08/02 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
小程序中手机号识别的示例
2020/12/14 Javascript
Python解释执行原理分析
2014/08/22 Python
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python常用知识点汇总
2016/05/08 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
分享vim python缩进等一些配置
2018/07/02 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
香港万宁官方海外旗舰店:香港健与美连锁店
2018/09/27 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
kfc实习自我鉴定
2013/12/14 职场文书
开展批评与自我批评发言材料
2014/05/15 职场文书
应聘教师求职信范文
2015/03/20 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
解决Mysql多行子查询的使用及空值问题
2022/01/22 MySQL
解决Git推送错误non-fast-forward的方法
2022/06/25 Servers