JVM口试题解,垃圾接纳之“对象存活判断”分析

[复制链接]
发表于 2025-11-5 10:20:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、JVM怎么判断一个类/对象是不是垃圾?

先来说怎样判断一个对象是不是垃圾

最常用的就是引用计数法和可达性分析
引用计数法

引用计数法为每个对象维护一个计数器来跟踪有多少个引用指向该对象。每当创建一个新的引用指向某个对象时,计数器加1;每当一个引用失效或被移除时,计数器减1。当计数器降为0时,表现没有其他对象引用它,因此可以安全地将其接纳。
引用计数法有个非常大的题目就是循环引用。
循环引用:如果两个或多个对象相互引用形成环状结构,纵然这些对象不再被外部利用,它们的引用计数也不会降为0,从而导致内存走漏。比方,A持有B的引用,B也持有A的引用,但没有任何其他对象引用A或B,这时它们应该被接纳,但由于相互引用,它们的引用计数都不会降为0。
那么如果接纳了引用计数法,怎样办理循环引用呢? 引入弱引用来突破循环引用链。弱引用不会增长对象的引用计数,因此当一个对象仅通过弱引用保持时,它可以被垃圾接纳器接纳。
可达性分析

可达性分析就是用来判断对象是否存活的。
这个算法的根本思绪就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。

二、说到GC ROOTS,你知道Java中哪些对象可作为GC ROOTS吗?

作为 GC Roots 的对象包罗下面几种(重点是前面 4 种):

      
  • 假造机栈(栈帧中的当地变量表)中引用的对象;各个线程调用方法堆栈中使
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表