引用计数法和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 23 Java/Android
分析Java中Map的遍历性能问题
Jun 26 Java/Android
Java日常练习题,每天进步一点点(38)
Jul 26 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
OpenCV实现普通阈值
Nov 17 Java/Android
聊聊SpringBoot自动装配的魔力
Nov 17 Java/Android
SpringBoot中HttpSessionListener的简单使用方式
Mar 17 Java/Android
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
Apr 19 Java/Android
Java死锁的排查
May 11 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
Jun 21 Java/Android
前端与RabbitMQ实时消息推送未读消息小红点实现示例
Jul 23 Java/Android
基于Android10渲染Surface的创建过程
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 一个比较完善的简单文件上传
2010/03/25 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
js中开关变量使用实例
2017/02/24 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
详细分析vue表单数据的绑定
2020/07/20 Javascript
Vue的Options用法说明
2020/08/14 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Python解析并读取PDF文件内容的方法
2018/05/08 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
浅谈python标准库--functools.partial
2019/03/13 Python
Django 外键的使用方法详解
2019/07/19 Python
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
医院门卫岗位职责
2013/12/30 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
2015年党员个人剖析材料
2014/12/18 职场文书
React如何创建组件
2021/06/27 Javascript
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript
MySQL派生表联表查询实战过程
2022/03/20 MySQL
html中两种获取标签内的值的方法
2022/06/16 jQuery