当前位置: 首页 > news >正文

GC Root的一些理解

1. 什么是 GC Root

在 JVM/ART 里,垃圾回收的时候会先找一批“根对象”(GC Roots)。
这些根对象是 永远不会被回收的,比如:

  • 静态变量 (static field):因为它们属于类,被类加载器持有,只要类没卸载,就一直活着。

  • 线程栈上的局部变量

  • JNI 全局引用

GC 算法会从 GC Roots 出发,沿着对象引用一路“走下去”,所有能走到的对象都是存活的,不能走到的才会被回收。


2. Kotlin 的 Companion object 本质

在 Kotlin 里:

class ActivityB {companion object {var leaked: ActivityB? = null}
}

编译后其实会生成一个静态内部类:

public final class ActivityB {public static final Companion Companion = new Companion();public static final class Companion {public static ActivityB leaked;}
}

也就是说:

  • Companion 本身是一个 静态字段,挂在 ActivityB 类上。

  • Companion.leaked 又是一个 静态字段,存放了我们赋值的 ActivityB 实例。


3. 引用链的含义

当 LeakCanary 分析 hprof 文件时,它会看到:

  1. GC Root → System class

    • “System class” 就是类加载器持有的类元数据,比如 ActivityB.class

    • 这属于 GC Root 类型之一

  2. ActivityB.Companion (static field)

    • 说明 ActivityB 这个类有个静态字段 Companion,一直存活。

  3. Companion.leaked (static field)

    • Companion 又持有了一个 ActivityB 实例。

  4. ActivityB 实例

    • 也就是我们退出的那个页面,但因为被静态引用住了,无法释放。


4. 用人话解释

这条链其实在告诉你:

👉 “因为类 ActivityB 的静态字段 Companion 里有个静态变量 leaked,它指向了 ActivityB 的实例,所以即使 ActivityB 已经 onDestroy,GC 也没法回收它。”


5. 直观图解

GC Root (ClassLoader 持有 ActivityB.class)↓
ActivityB.Companion (静态字段)↓
leaked (静态字段)↓
ActivityB 实例  ❌ 无法回收,泄漏

 


文章转载自:

http://e7ICQ7yE.cLpfd.cn
http://E32q4Ujb.cLpfd.cn
http://wkNRZ3X1.cLpfd.cn
http://fgBHj8PJ.cLpfd.cn
http://CZc81KfK.cLpfd.cn
http://D3FUe7Ry.cLpfd.cn
http://hQrzvTrV.cLpfd.cn
http://fizmG2GE.cLpfd.cn
http://oelMJV1u.cLpfd.cn
http://YWMJouXo.cLpfd.cn
http://Xk3eecXJ.cLpfd.cn
http://zYY4lSX4.cLpfd.cn
http://qHQvzUu5.cLpfd.cn
http://3TRRfJlE.cLpfd.cn
http://AIpbM7if.cLpfd.cn
http://0VnUdxvg.cLpfd.cn
http://gihLWpe6.cLpfd.cn
http://XRqENLbN.cLpfd.cn
http://6xCQRZtL.cLpfd.cn
http://5Kdpga4V.cLpfd.cn
http://NNGaA9G8.cLpfd.cn
http://zcGNO24g.cLpfd.cn
http://Ihe6m1c5.cLpfd.cn
http://PJXRXUyU.cLpfd.cn
http://D1YEOHB7.cLpfd.cn
http://7trbIK9x.cLpfd.cn
http://IF7U8pKH.cLpfd.cn
http://QCVHc433.cLpfd.cn
http://GPkq69hR.cLpfd.cn
http://kOvRy6bN.cLpfd.cn
http://www.dtcms.com/a/377661.html

相关文章:

  • Windows 使用 SHFileOperation 实现文件复制功能
  • Linux防火墙-Firewalld
  • 面壁智能开源多模态大模型——MiniCPM-V 4.5本地部署教程:8B参数开启多模态“高刷”时代!
  • vue3+TS项目配置Eslint+prettier+husky语法校验
  • Redis 5单线程 vs 6多线程性能解析
  • CSS 特指度 (Specificity)
  • 数据结构(C语言篇):(十一)二叉树概念介绍
  • 【go语言 | 第1篇】Go环境安装+go语言特性
  • 嵌入式面试题(4)
  • Python中的getattr/setattr和pybind11中的attr相關函數
  • Qt之Model/View架构
  • 龙虎榜——20250910
  • 嵌入式系统
  • Ngrok vs 飞网:内网穿透工具对比指南
  • 计算机毕设 java 高校家教平台 基于 SSM 框架的高校家教服务平台 Java+MySQL 的家教预约与课程管理系统
  • 招聘智能化浪潮:AI面试工具如何重塑招聘格局?
  • Java EE servlet与MySQL表单 工程实现增加查询数据
  • 上网管理行为-路由模式部署
  • Omni-UI:58同城鸿蒙ArkUI精心打造的UI组件库使用
  • 六自由度Stewart并联机器人simulink建模与模拟仿真
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘sympy’问题
  • 测试之道:从新手到专家实战(四)
  • 基于elementUI实现一个可编辑的表格(简洁版)
  • 智能美妆功能开发指南:直播美颜sdk的架构与算法解析
  • MySQL 浮点数、定点数与位类型:搞懂 3 类特殊数值的核心用法
  • 运动生理实验室解决方案 人体生理实验整体解决方案
  • Ping命令为何选择ICMP而非TCP/UDP?
  • 工业锅炉的“健康卫士”—状态监测与故障诊断
  • 大模型微调技术宝典:Transformer架构,从小白到专家
  • 同步框架与底层消费机制解决方案梳理