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

垃圾判定算法简介

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

引用计数法

引用计数法就是每个内存对象维护一个引用计数器。当有引用指向这块内存时,计数器+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 小时前
从零搭建 DeepSeek-R1 WebGPU 聊天应用(一):进度条组件与 React 核心概念
面试
ShineWinsu3 小时前
对于Linux:模版方法类的解析以及socket、TcpSocket的封装
linux·c++·面试·socket·模板方法模式·封装·tcpsocket
不简说3 小时前
JS 代码技巧 vol.8 — 20 个函数式编程实战,把 if/else 拍扁的骚操作
前端·javascript·面试
我叫黑大帅5 小时前
我为什么单一消费者的场景下,要用 Redis List 当消息队列?
redis·后端·面试
吃饱了得干活5 小时前
亿级订单表分库分表设计,从0到1全流程
java·数据库·面试
LING-Z5 小时前
JVM GC 机制详解:算法、分代、回收器、GC 类型一篇讲透
java·jvm·垃圾回收
大不点wow6 小时前
Java序列化与反序列化:让对象走出JVM
java·开发语言·jvm
程序员天天困6 小时前
Arthas trace 命令怎么用?一行定位最慢那行代码
jvm·后端
程序员爱钓鱼8 小时前
Go 开发环境安装(Windows、macOS、Linux)
后端·面试·go
触底反弹8 小时前
🤯 面试被问 AI Workflow 和 Agent 有啥区别?3 张图 + 2 段代码讲清楚!
人工智能·设计模式·面试