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

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

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

引用计数法

给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 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. 方法区中常量引用的对象

相关文章
|
6月前
|
存储 人工智能 安全
自媒体创作场景实践|通义千问3 + MCP=一切皆有可能
本文介绍了通过MCP(Model Context Protocol)结合通义千问大模型实现跨平台、跨服务的自动化任务处理方案。使用Qwen3-235B-A22B模型,配合ComfyUI生成图像,并通过小红书等社交媒体发布内容,展示了如何打破AI云服务的数据孤岛。具体实践包括接入FileSystem、ComfyUI和第三方媒体Server,完成从本地文件读取到生成图像再到发布的全流程。 方案优势在于高可扩展性和易用性,但也存在大模型智能化不足、MCP Server开发难度较大及安全风险等问题。未来需进一步提升模型能力、丰富应用场景并解决安全挑战,推动MCP在更多领域落地。
1584 27
自媒体创作场景实践|通义千问3 + MCP=一切皆有可能
|
Web App开发 网络协议 数据可视化
tcpdump 和 wireshark 抓包工具 ,介绍、安装、命令使用。 详解三次握手、四次挥手。两个结合使用,会更好分析报文
这篇文章详细介绍了网络抓包工具tcpdump和Wireshark的使用,包括安装、命令选项、过滤器语法,以及如何通过分析TCP的三次握手和四次挥手来理解网络通信细节。
3859 1
|
JavaScript 开发者
vue学习之响应式数据绑定
响应式数据绑定
218 0
|
关系型数据库 MySQL 数据库
【MySQL】-多表设计(一对多、一对一、多对多)
设计数据库时,不同类型的关系需要谨慎考虑,以反映实际需求并优化性能。查询设计良好的数据库通常会更高效,并有助于减少数据冗余和维护成本。同时,确保外键索引的正确使用,可以显著提升查询效率和数据一致性。通过这些原则和技巧的应用,我们可以在遵循数据库设计的最佳实践的同时,确保数据的可扩展性和可维护性。
1377 4
|
机器学习/深度学习 监控 计算机视觉
测试 opencv-python 中的 mat 和 Umat 处理图像的差异(GPU加速)
测试 opencv-python 中的 mat 和 Umat 处理图像的差异(GPU加速)
1463 0
|
C++
[Qt5] VS环境下实现Qt5两个窗口相互切换
[Qt5] VS环境下实现Qt5两个窗口相互切换
291 0
|
监控 Shell
Shell脚本实战教学
Shell脚本实战教学
164 5
|
机器学习/深度学习 人工智能 达摩院
达摩院OpenVI-图像MOS评价协助清理“垃圾”照片
达摩院OpenVI-图像MOS评价协助清理“垃圾”照片