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

什么是 GC Roots??一文带你看懂!!

什么是 GC Roots ?

    • JVM 是如何判断哪些对象应该回收,哪些应该保留呢?
    • GC Roots

堆是一个巨大的对象集合,其中包含许多对象实例。

这些对象在堆中有不同的引用层次。一些接口会被频繁调用,每秒生成大量对象。这些对象之间形成复杂的联系网络。尽管 Java 一直试图创造一种永无止境的内存感觉,但对象不能一直增加下去,因此需要进行垃圾回收。

JVM 是如何判断哪些对象应该回收,哪些应该保留呢?

古代有“诛九族”的想法。如果有人犯了大错,皇帝杀死一个人不足以平息他的怒火,那么会连坐其亲友。诛九族需要追溯到一个共同的祖先,然后向下延伸。在堆的垃圾回收中也有类似的思路。下面我们具体分析 JVM 如何执行垃圾回收。

JVM 的垃圾收集动作是不受程序控制的,会在满足条件时自动启动。

在进行垃圾回收时,JVM 能够追踪到对象的祖先引用。最终发现,如果这些祖先已经不再存在,它们将被清理掉。那些能够逃过垃圾回收的祖先非常特殊,它们被称为 GC Roots

GC Roots

通过从 GC Roots 开始向下追溯和搜索,形成一个称为“Reference Chain”(引用链)的链条。当一个对象无法与任何 GC Root 建立关联时,它将被无情地清除。

例如,Obj5、Obj6、Obj7 由于无法与 GC Roots 关联,将在垃圾回收时被销毁。
在这里插入图片描述
垃圾回收就是围绕着 GC Roots 去做的。同时,它也是很多内存泄露的根源,因为其他引用根本没有这样的权利。

GC Roots 是一组必须活跃的引用。用通俗的话来说,就是程序接下来通过直接引用或者间接引用,能够访问到的潜在被使用的对象

GC Roots 包括:

  1. 虚拟机栈中引用的对象

    • 当一个对象在虚拟机栈(栈帧中的本地变量表)中被引用时,它充当了 GC Root 的作用。例如:
      public class Example {public static void main(String[] args) {Example obj = new Example(); // obj 是 GC Rootobj = null; // 断开 obj 对原对象的引用}
      }
      
    • 在上面的示例中,obj 是虚拟机栈中的本地变量,当 obj 被赋值为 null 时,原对象与 GC Root 断开连接,因此原对象会被回收。
  2. 方法区中类静态属性引用的对象

    • 类静态属性引用的对象也是 GC Roots。例如:
      public class Example {public static Example s; // 类静态属性引用的对象public static void main(String[] args) {Example obj = new Example();obj.s = new Example(); // s 是 GC Rootobj = null; // 断开 obj 对原对象的引用}
      }
      
    • 在上面的示例中,当栈帧中的本地变量 obj = null 时,由于 obj 原来指向的对象与 GC Root (变量 obj) 断开了连接,所以 obj 原来指向的对象会被回收,而由于我们给 s 赋值了变量的引用,s 在此时是类静态属性引用,充当了 GC Root 的作用,它指向的对象依然存活
  3. 方法区中常量引用的对象

    • 常量引用的对象也不会因为其他引用断开而被回收。例如:
      public class Example {public static final Example CONSTANT = new Example(); // 常量引用的对象public static void main(String[] args) {Example obj = new Example();obj = null; // 断开 obj 对原对象的引用,但 CONSTANT 不受影响}
      }
      
    • 在上面的示例中,常量 CONSTANT 指向的对象不会因为 obj 的断开而被回收。
  4. 本地方法栈中 JNI 引用的对象

    • JNI(Java Native Interface)是 Java 调用非 Java 代码的接口,本地方法栈中 JNI 引用的对象也是 GC Roots。例如:
JNIEXPORT void JNICALL Java_com_pecuyu_jnirefdemo_MainActivity_newStringNative(JNIEnv *env, jobject instance,jstring jmsg) {
...// 缓存String的classjclass jc = (*env)->FindClass(env, STRING_PATH);
}

有两个注意点:

  • 我们这里说的是活跃的引用,而不是对象,对象是不能作为 GC Roots 的。
  • GC 过程是找出所有活对象,并把其余空间认定为“无用”;而不是找出所有死掉的对象,并回收它们占用的空间。所以,哪怕 JVM 的堆非常的大,基于 tracing 的 GC 方式,回收速度也会非常快。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MT3047 区间最大值
  • 百元平价蓝牙耳机哪款好?平价高性价比蓝牙耳机推荐
  • 新书速览|HTML5+CSS3 Web前端开发与实例教程:微课视频版
  • 【C++初阶】C++入门(下)
  • 学圣学最终的目的是:达到思无邪的状态( 纯粹、思想纯正、积极向上 )
  • Scala 数据类型
  • 香橙派5plus上跑云手机方案二 waydroid
  • 【cocos2dx】【iOS工程】如何保存用户在游戏内的绘画数据,并将数据以图像形式展示在预览界面
  • 底软基础 | 嵌入式程序员编程必看的525钟C/C++ 安全编程问题
  • 联想拯救者Y7000 IRX9 笔记本接口功能介绍
  • 一文实践强化学习训练游戏ai--doom枪战游戏实践
  • 网络安全----防御----防火墙安全策略组网
  • 设计模式之外观模式(Facade)
  • Grind 75 | 3. merge two sorted lists
  • 二、分布式软总线是如何高效的传输数据和任务的
  • [NodeJS] 关于Buffer
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Angular4 模板式表单用法以及验证
  • C++类的相互关联
  • JS专题之继承
  • mongo索引构建
  • SQLServer插入数据
  • 二维平面内的碰撞检测【一】
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 计算机常识 - 收藏集 - 掘金
  • 前端知识点整理(待续)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 详解NodeJs流之一
  • 小程序button引导用户授权
  • 一文看透浏览器架构
  • Android开发者必备:推荐一款助力开发的开源APP
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ‌JavaScript 数据类型转换
  • #565. 查找之大编号
  • #java学习笔记(面向对象)----(未完结)
  • (10)STL算法之搜索(二) 二分查找
  • (Forward) Music Player: From UI Proposal to Code
  • (笔试题)分解质因式
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一)Java算法:二分查找
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)IOS中获取各种文件的目录路径的方法
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET 给NuGet包添加Readme
  • .net 验证控件和javaScript的冲突问题
  • .NET6实现破解Modbus poll点表配置文件
  • .Net多线程Threading相关详解
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .Net中间语言BeforeFieldInit