如何判断一个对象是否存活?

简介: 如何判断一个对象是否存活?

对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不再被任何途径引用的对象)。判断对象是 否存活有两种方法:引用计数法和可达性分析。

引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1; 任何时候计数器为 0 的对象就是不可能再被使用的。

这种方法很难解决对象之间相互循环引用的问题。比如下面的代码, obj1 和 obj2 互相引用,这种情 况下,引用计数器的值都是1,不会被垃圾回收。

publicclassReferenceCount {
Objectinstance=null;
publicstaticvoidmain(String[] args) {
ReferenceCountobj1=newReferenceCount();
ReferenceCountobj2=newReferenceCount();
obj1.instance=obj2;
obj2.instance=obj1;
obj1=null;
obj2=null;
    }
}

可达性分析

通过 GC Root 对象为起点,从这些节点向下搜索,搜索所走过的路径叫引用链,当一个对象到 GC Root 没有任何的引用链相连时,说明这个对象是不可用的。

image.png

可作为GC Roots的对象有哪些?

1. 虚拟机栈中引用的对象

2. 本地方法栈中Native方法引用的对象

3. 方法区中类静态属性引用的对象

4. 方法区中常量引用的对象

相关文章
|
JavaScript 开发者
vue学习之响应式数据绑定
响应式数据绑定
199 0
|
关系型数据库 MySQL 数据库
【MySQL】-多表设计(一对多、一对一、多对多)
设计数据库时,不同类型的关系需要谨慎考虑,以反映实际需求并优化性能。查询设计良好的数据库通常会更高效,并有助于减少数据冗余和维护成本。同时,确保外键索引的正确使用,可以显著提升查询效率和数据一致性。通过这些原则和技巧的应用,我们可以在遵循数据库设计的最佳实践的同时,确保数据的可扩展性和可维护性。
1192 4
|
C++
[Qt5] VS环境下实现Qt5两个窗口相互切换
[Qt5] VS环境下实现Qt5两个窗口相互切换
262 0
|
监控 Shell
Shell脚本实战教学
Shell脚本实战教学
151 5
|
机器学习/深度学习 人工智能 达摩院
达摩院OpenVI-图像MOS评价协助清理“垃圾”照片
达摩院OpenVI-图像MOS评价协助清理“垃圾”照片
|
前端开发 JavaScript jenkins
前端项目自动化部署——超详细教程(Jenkins、Github Actions)(一)
前端项目自动化部署——超详细教程(Jenkins、Github Actions)
749 0
|
机器学习/深度学习 人工智能 搜索推荐
艾科瑞特科技(iCREIDT):2023年6月7日每日智能图像分析老照片翻新
艾科瑞特科技(iCREIDT):2023年6月7日每日智能图像分析老照片翻新 人工智能技术、艾科瑞特、iCREDIT、AI、智能图像分析、老照片精修、MIDJOURNEY、CHATGPT、老照片翻新、老照片上色、人工智能技术应用、AIGC、机器学习、艾科瑞特科技、老照片修复、大数据、艾科瑞特科技云市场、人工智能、图像分析