模拟面试回答第十七问:垃圾判定算法

垃圾判定算法简介

关于垃圾判定算法,主要有两种:引用计数法和可达性分析法。

引用计数法

引用计数法就是每个内存对象维护一个引用计数器。当有引用指向这块内存时,计数器+1,引用失效时-1,但这个算法有个致命缺陷------循环引用。

比如:创建A和B对象,A的next和B的next互相指向,当方法结束后,A和B对象引用消失后,A和B的内存的计数器都是1,也就是说判定为垃圾,因为A和B的next互相引用,这是堆中的对象,不出现在栈中,栈中只有A和B的对象引用,没有next,所以销毁的是A和B的对象引用,而堆中的next依然存在,指向互相的内存,所以这两块内存随着对象引用的消失而无法访问,又由于next指针而一直存活不被GC。

可达性分析法

可达性分析法就是维护从GCRoots出发的引用链。有一组叫做GCRoots的根对象,从它们出发能到达的对象就是存活对象,现代的JVM都采用这种方法。

GCRoots

接着我介绍一下GCRoots,什么样的对象可以被叫做GCRoots,首先局部变量,静态变量这些都是GCRoots,其次本地方法栈的JNI引用,就是C++语言写的,以及同步锁持有的对象和JVM内部的对象。

相关推荐
吴声子夜歌2 分钟前
JVM——原子操作类实现原理
jvm·原子操作类
小江的记录本18 分钟前
【Spring全家桶】Spring AI核心原理、大模型集成、Prompt工程、RAG实现、AI Agent开发(附《思维导图》+《面试高频考点清单》)
java·人工智能·spring boot·后端·spring·面试·prompt
EMA21 分钟前
Agent开发中数据分析图表工具分层暴露方案总结
面试
牛油果子哥q30 分钟前
【C++封装】C++封装思想与访问权限终极精讲:public/private/protected权限解析、类封装设计、继承权限变化、工程私有化规范与面试坑点
c++·面试
胡萝卜术36 分钟前
从零开始掌握AI应用开发:我的大模型学习路线图(RAG/Agent/MCP/全栈实践)
前端·javascript·面试
wyu7296143 分钟前
SpringBoot八股的一些概念笔记
java·面试
eddietao1 小时前
什么是 fail-fast?什么是 fail-safe?
java·面试
且听风吟_xincell1 小时前
从零用 TypeScript 写一个 TCP 聊天室(下)——数据持久化、登录验证与管理指令
jvm·tcp/ip·typescript
小江的记录本1 小时前
【Spring全家桶】Spring Cloud 2023.0.x:配置中心:Nacos Config、Apollo(附《思维导图》+《面试高频考点清单》)
java·spring boot·后端·python·spring·spring cloud·面试
牛油果子哥q2 小时前
【C++静态成员】C++静态成员终极精讲:静态成员变量、静态成员函数、内存布局、对象共享机制、工程实战、深浅坑点与面试满分总结
c++·面试