美文网首页
GC - 根结点枚举

GC - 根结点枚举

作者: 面向对象架构 | 来源:发表于2022-12-16 01:49 被阅读0次

根节点枚举

在可达性算法当中是通过GC ROOT的引用找到存活对象的方式,在现代的收集器基本可以做到和用户线程一起并发执行的程度,但是根节点枚举要保证某个时间点的“快照”,这也意味着根节点枚举需要暂停用户线程。

一套完整的“GC Roots”也必须考虑分代回收和局部回收的问题。例如 Partial GC 针对堆中某块区域的发起垃圾回收时,也必须考虑此内存区域内的对象是否可能被其他区域引用? 所以此时也必须将这些关联区域的对象一起加入到“GC Roots”集合里,才能保证可达性分析的正确性。

OopMap 数据结构

枚举出整个“GC Roots”是非常麻烦的

  1. 运行时数据本身就是动态的。
  2. Java应用越来越大。

JVM 如何解决呢?

首先在进行根节点选举时,必须暂停全部的用户线程,我们把这个过程称为“Stop The Word”(下面简称STW)(注:但必须要说明,STW不一定是全局的,也可以是局部的,这和安全点的类型有关。此时说的必须暂停全部用户线程只是因为GC时必须使全部线程进入安全点(gc safe point))。

在HotSpot的解决方案中,是使用一组称为OopMap的数据结构来存放这些对象的引用(OopMap在类加载动作完成时生成)。也就是说当用户线程暂停下来之后,其实并不需要一个不漏的检查完所有的执行上下文和全局的引用位置。而是直接通过OopMap来获取栈上或寄存器里哪里有GC管理的指针(引用指针)。

这种结构会存在哪些问题?
这里可以看到,如果每一次对象的读取变化,都需要往OopMap里面存储内容,会导致OopMap的内容不断臃肿扩大,垃圾收集器的扫描成本会变得非常的昂贵。
为了应对这一类问题,HotSpot引入了“安全点这一机制进行处理”。

相关文章

  • GC - 根结点枚举

    根节点枚举 在可达性算法当中是通过GC ROOT的引用找到存活对象的方式,在现代的收集器基本可以做到和用户线程一起...

  • JVM:垃圾收集器与内存分配策略(下)

    HotSpot算法实现 枚举根节点:从GC Roots节点中找出引用链的操作。GC Roots对象主要在全局性引用...

  • Hotspot的算法实现

    1.枚举根节点 可达性分析中从GC Roots找引用链为例。 可作为GC Roots的节点做要在全局性的引用(例常...

  • HotSpot的算法实现(安全点等概念)

    1.枚举根节点 目前主流的虚拟机都是采用准确式GC,当系统停顿下来时并不需要寻找每一个GC Roots。(stop...

  • 3、垃圾收集与内存分配策略(2)(JVM笔记)

    四、HotSpot的算法实现 4.1 枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为...

  • GC是如何快速枚举根节点的?

    Java一个优点就是GC(Garbage Collection),虽然它能帮我们管理内存,但是它工作的时候会STW...

  • 2018-11-05

    以根节点的右结点为新的根节点,根节点的右结点指向新根节点的左结点,再将新根节点的左结点指向元根节点!这种无人能懂的饶舌…

  • JVM-对象已死判断

      1)引用计数器法(无法解决循环引用) 2)枚举根节点做可达性分析。  GC Roots:一组必须活跃的引用。 ...

  • 数据结构与算法15-二叉树

    1.概念 度: 结点拥有的子树数目称为结点的度。 结点的层次: 从根开始定义起,根为第1层,根的子结点为第2层,以...

  • 数据结构与算法-二叉树

    1.概念 度: 结点拥有的子树数目称为结点的度。 结点的层次: 从根开始定义起,根为第1层,根的子结点为第2层,以...

网友评论

      本文标题:GC - 根结点枚举

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