美文网首页
如何理解gc root

如何理解gc root

作者: 周卡卡_ba00 | 来源:发表于2019-10-27 09:26 被阅读0次

作者:RednaxelaFX链接:https://www.zhihu.com/question/53613423/answer/135743258来源:知乎著作权归作者所有,转载请联系作者获得授权。

之前看深入理解JVM这本书,对里面的GC ROOT的真实含义不是太清楚,网上查了一大堆资料都没有说的很清楚,下面这是从知乎大神上看到的,这里面记录一下,和大家一起学习

所谓“GC roots”,或者说tracing GC的“根集合”,就是一组必须活跃的引用。例如说,这些引用可能包括:

所有Java线程当前活跃的栈帧里指向GC堆里的对象的引用;换句话说,当前所有正在被调用的方法的引用类型的参数/局部变量/临时值。

VM的一些静态数据结构里指向GC堆里的对象的引用,例如说HotSpot VM里的Universe里有很多这样的引用。

JNI handles,包括global handles和local handles

(看情况)所有当前被加载的Java类

(看情况)Java类的引用类型静态变量

(看情况)Java类的运行时常量池里的引用类型常量(String或Class类型)

(看情况)String常量池(StringTable)里的引用注意,是一组必须活跃的引用,不是对象。

Tracing GC的根本思路就是:给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活,其余对象(也就是没有被遍历到的)就自然被判定为死亡。注意再注意:tracing GC的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。GC roots这组引用是tracing GC的起点。要实现语义正确的tracing GC,就必须要能完整枚举出所有的GC roots,否则就可能会漏扫描应该存活的对象,导致GC错误回收了这些被漏扫的活对象。

这就像任何递归定义的关系一样,如果只定义了递推项而不定义初始项的话,关系就无法成立——无从开始;而如果初始项定义漏了内容的话,递推出去也会漏内容。

那么分代式GC对GC roots的定义有什么影响呢?答案是:分代式GC是一种部分收集(partial collection)的做法。在执行部分收集时,从GC堆的非收集部分指向收集部分的引用,也必须作为GC roots的一部分。具体到分两代的分代式GC来说,如果第0代叫做young gen,第1代叫做old gen,那么如果有minor GC / young GC只收集young gen里的垃圾,则young gen属于“收集部分”,而old gen属于“非收集部分”,那么从old gen指向young gen的引用就必须作为minor GC / young GC的GC roots的一部分。继续具体到HotSpot VM里的分两代式GC来说,除了old gen到young gen的引用之外,有些带有弱引用语义的结构,例如说记录所有当前被加载的类的SystemDictionary、记录字符串常量引用的StringTable等,在young GC时必须要作为strong GC roots,而在收集整堆的full GC时则不会被看作strong GC roots。

换句话说,young GC比full GC的GC roots还要更大一些。如果不能理解这个道理,那整个讨论也就无从谈起了。

相关文章

  • GC Root集合的理解

    拒绝简单的记忆,仔细想想为什么GC Root集合中都是这几类。 先看下周志明老师书中的概念 第一类,常量。当一些变...

  • Java常见的GC Root

    我们知道Java 进行GC的时候会从GC root进行可达性判断,常见的GC Root有如下: 通过System ...

  • 面试笔记-GC回收机制

    不写废话,帮助你快速理解应对面试 目录 垃圾的定义可达性分析GC Root对象回收的时机如何进行垃圾回收 标记清除...

  • GC Root:

    www.jianshu.com/p/5db05db4f5ab www.jianshu.com/p/6ab2a0f7...

  • gc root

    一、oopMap oop (ordinary object pointer) 普通对象指针,oopmap就是存放这...

  • 什么是GC ROOT?有哪些GC ROOT?

    上⾯提到的标记的算法,怎么标记⼀个对象是否存活?简单的通过引⽤计数法,给对象设置⼀个引⽤计数器,每当有⼀个地⽅引⽤...

  • 二、GC ROOT

    jvm在判断对象是否还有用的时候,通常会从一些常见的地方开始进行搜索,只要对象不能从这些地方被引用到,就判断这些没...

  • Gc Root对象

    1. gc root对象有那些 1.1解释 常说的GC(Garbage Collector) roots,特指的是...

  • 垃圾回收

    1、引用计数器 2、可达性分析 GC Root: Java语言中,可做为GC Root的对象有以下几种: 虚拟机栈...

  • GCRoots

    转载Java中什么样的对象才能作为gc root,gc roots有哪些呢? java的gc为什么要分代? 所谓"...

网友评论

      本文标题:如何理解gc root

      本文链接:https://www.haomeiwen.com/subject/jryvvctx.html