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

垃圾判定算法简介

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

引用计数法

引用计数法就是每个内存对象维护一个引用计数器。当有引用指向这块内存时,计数器+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内部的对象。

相关推荐
萧瑟余晖6 小时前
Spring Data Redis详解
spring·面试
王中阳Go7 小时前
面试官问什么,取决于你简历上写了什么:后端转 Agent 岗的项目准备法
后端·面试·agent
shoolay7 小时前
神经网络的训练与历史进程
面试·架构
花间相见8 小时前
【计算基础|MySQL17】三大日志:undo / redo / binlog
数据库·后端·面试
今天的砖头有点烫手啊8 小时前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm
凯凯姜8 小时前
JVM 内存持续增长与 Full GC 频繁
jvm
驭渊的小故事9 小时前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
吹什么轩11 小时前
MySQL 内置函数全景:日期 / 字符串 / 数学 / 其他,一次讲透(附索引杀手排查)
java·数据库·面试
怕浪猫20 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github