当前主流的商用程序语言(Java、C#,上溯至前面提到的古老的Lisp)的内存管理子系统,都是通过可达性分析(Reachability Analysis)算法来判定对象是否存活的。这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。

如图3-1所示,对象object 5、object 6、object 7虽然互有关联,但是它们到GC Roots是不可达的,因此它们将会被判定为可回收的对象。

在Java技术体系里面,固定可作为GC Roots的对象包括以下几种:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

    关联记忆:例如局部变量存在栈中,当方法执行完后,所有的局部变量就会弹出栈,就会进行回收。反之,在栈内的话,就不可回收。

  • 在方法区中类静态属性引用的对象,譬如Java类的引用类型静态变量。

    关联记忆:静态属性生命期和jvm一致,等价于永远存在。

  • 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。

  • 在本地方法栈中JNI(即通常所说的Native方法)引用的对象。

  • Java虚拟机内部的引用,如基本数据类型对应的Class对象,一些常驻的异常对象(比如NullPointExcepiton、OutOfMemoryError)等,还有系统类加载器。

  • 所有被同步锁(synchronized关键字)持有的对象。

  • 反映Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

除了这些固定的GC Roots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”地加入,共同构成完整GC Roots集合。譬如后文将会提到的分代收集和局部回收(Partial GC),如果只针对Java堆中某一块区域发起垃圾收集时(如最典型的只针对新生代的垃圾收集),必须考虑到内存区域是虚拟机自己的实现细节(在用户视角里任何内存区域都是不可见的),更不是孤立封闭的,所以某个区域里的对象完全有可能被位于堆中其他区域的对象所引用,这时候就需要将这些关联区域的对象也一并加入GC Roots集合中去,才能保证可达性分析的正确性。

目前最新的几款垃圾收集器[1]无一例外都具备了局部回收的特征,为了避免GC Roots包含过多对象而过度膨胀,它们在实现上也做出了各种优化处理。关于这些概念、优化技巧以及各种不同收集器实现等内容,都将在本章后续内容中一一介绍。

可达性分析算法GC Roots相关推荐

  1. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  2. 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还"存活"着,哪些对 ...

  3. 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...

  4. 31. 如何计算对象已死(引用计数器算法、可达性分析算法)32.对象是否可 GC?33. Minor GC 和 Full GC

    31. 如何计算对象已死 31.1.引用计数器算法 引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象 ...

  5. java gc 可达性_JAVA--GC 垃圾回收机制----可达性分析算法

    在JVM 中,java 为我们提供可有效的垃圾回收机制,GC ,GC的创建无疑是为了缓解内存压力.保存有效数据.回收垃圾无效数据: 在此之前GC在我的理解中,一直只是个概念,内存中出现垃圾,GC来回收 ...

  6. 对象是否要被回收(引用计数和可达性分析算法)

    java堆和方法区主要存放各种类型的对象(方法区中也存储一些静态变量和全局常量等信息),那么我们在使用GC对其进行回收的时候首先要考虑的就是如何判断一个对象是否应该被回收.也就是要判断一个对象是否还有 ...

  7. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!

    前言:学习JVM,那么不可避免的要去了解JVM相关的垃圾回收算法,本文只是讲了讲了可达性分析算法,至于标记-清除.标记-复制,标记-整理,分代收集等等算法,会在近两天的文章中陆续更新出来. 很喜欢一句 ...

  8. 3.内存分配、逃逸分析与栈上分配、直接内存和运行时常量池、基本类型的包装类和常量池、TLAB、可达性分析算法(学习笔记)

    3.JVM内存分配 3.1.内存分配概述 3.2.内存分配–Eden区域 3.3.内存分配–大对象直接进老年代 3.3.1.背景 3.3.2.解析 3.4.内存分配–长期存活的对象进去老年代 3.5. ...

  9. JVM—引用计数和可达性分析算法(存活性判断)

    1 引用计数算法 1.1 算法思想   给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:   当引用失效时,计数器值就减1:   任何时候计数器为0时的对象就是不能再被使用. 1. ...

  10. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

最新文章

  1. MySQL编码引发的两个问题
  2. JAVA个go哪个写web方便_Go语言实现的一个简单Web服务器
  3. 在机器学习中,怎么对超参数Hyper parameter优化?我总结了以下常见的方法
  4. day001-html知识点总结(二)不常见但很重要的元素汇总
  5. MySQL 主从复制 复制过滤
  6. img src 本地图片_Java爬取简单的网页内容和图片
  7. problem making ssl connection
  8. CAM350学习进行时
  9. 201703:SuiteCRM自定义筛选界面
  10. Qt OpenGL加载OBJ模型
  11. Egret引擎基础教程I(下载安装创建第一个项目)
  12. Linux期末复习第三章
  13. android怎样开启root权限管理,【经验】安卓手机怎么开启Root权限?
  14. 安庆集团-冲刺日志(第八天)
  15. pythonstdin_理解Python中的stdin stdout stderr - The Hard Way Is Easier
  16. 小米电视刷鸿蒙系统,小米电视怎么刷鸿蒙OS系统?一招立省上千块
  17. PAKDD 2019 AutoML 挑战赛圆满落幕,中国队伍包揽前三...
  18. 最佳联盟营销软件解决方案:简化你的联盟管理
  19. 亚裔在澳大利亚难登事业巅峰?会说英语是关键
  20. Open CASCADE安装及+MFC

热门文章

  1. 免费作图软件draw.io 软件输入数学公式和文本
  2. c#将byte转为int_C# int转byte[],byte[]转int
  3. Halcon颜色分类-阈值分区法
  4. vue 创建项目之vue init webpack xxx
  5. 5V限流IC,0.4A-4.8A可调限流芯片解决方案
  6. 人民币对PHP金汇率,PHP货币是哪个国家的,和人民币的汇率怎么样,3万人民币能兑换多少?...
  7. 2022抖音日活用户超8亿,旅游商家如何从抖音获客?
  8. Python打包exe文件并换图标【最强版教程】
  9. kettle和spoon ETL数据同步工具
  10. julia安装源_Julia 国内镜像安装实测