OopMap 用于枚举 GC Roots,记录栈中引用数据类型的位置。

记录栈上本地变量到堆上对象的引用关系。其作用时,垃圾收集时,收集线程会堆栈上的内存进行扫描,看看哪些位置存储了Reference类型。如果风险某个位置确实存的时Reference类型,就以为着它锁引用的对象这一次不能被回收。问题,栈上的本地变量表里面只有一部分数据时Reference类型的,那些非Reference类型的数据对我们而言毫无用途,但我们还是不得不堆整个栈全部扫描一遍,这是堆时间和资源的一种浪费。

一个很自然的想法时,能不能用空间换时间?在某个时候把栈上代表的引用的位置全部记录下来,这样到真正gc的时候就可以直接读取,而不用再一点一点的扫描了,Hotspot就是实现的。它使用一种叫做OopMak的数据结构来记录这类信息。

一个线程以为一个栈,一个栈由多个栈桢组成,一个栈桢对应一个方法,一个方法有多个安全点。GC发生时,程序首先运行到最近的一个安全点停下来,然后更新自己的OopMap,记录栈上哪些位置代表着引用。枚举根节点时,递归遍历每个栈桢的OopMap ,通过栈中记录的被引用的对象内存地址,即可找到这些对象(GC Roots)。

oopMap

  • 可以避免全栈扫描,加快枚举根节点的速度

  • 可以帮助HotSpot实现准确式GC

RememberedSet 用于可达性分析

RememberedSet 用于处理这类问题:比如说,新生代 gc (它发生得非常频繁)。一般来说, gc 过程是这样的:首先枚举根节点。根节点有可能在新生代中,也有可能在老年代中。这里由于我们只想收集新生代(换句话说,不想收集老年代),所以没有必要对位于老年代的 GC Roots 做全面的可达性分析。但问题是,确实可能存在位于老年代的某个 GC Root,它引用了新生代的某个对象,这个对象你是不能清除的。那怎么办呢?
      仍然是拿空间换时间的办法。事实上,对于位于不同年代对象之间的引用关系,虚拟机会在程序运行过程中给记录下来。对应上面所举的例子,“老年代对象引用新生代对象”这种关系,会在引用关系发生时,在新生代边上专门开辟一块空间记录下来,这就是 RememberedSet 。所以“新生代的 GC Roots ” + “ RememberedSet 存储的内容”,才是新生代收集时真正的 GC Roots 。然后就可以以此为据,在新生代上做可达性分析,进行垃圾回收。

我们知道, G1 收集器使用的是化整为零的思想,把一块大的内存划分成很多个域( Region )。但问题是,难免有一个 Region 中的对象引用另一个 Region 中对象的情况。为了达到可以以 Region 为单位进行垃圾回收的目的, G1 收集器也使用了 RememberedSet 这种技术,在各个 Region 上记录自家的对象被外面对象引用的情况。

参考:https://www.iteye.com/blog/dsxwjhf-2201685

OopMap 和 RememberedSet相关推荐

  1. java安全点_关于OopMap、SafePoint(安全点)以及安全区域

    1.OopMap 之前我们提到,在正式的GC之前总是需要进行可达性分析来查找内存中所有存活的对象,以便GC能够正确的回收已经死亡的对象.那么对于一个十分复杂的系统,每次GC的时候都要遍历所有的引用肯定 ...

  2. JVM之OopMap,安全点,安全区

    文章目录 一.什么是OopMap 二.安全点(safe point) 三.安全区(safe region) 四.卡表(card table) 五.写屏障(write barier) 总结 一.什么是O ...

  3. 虚拟机使用rememberedSet来避免全堆扫描

    虚拟机使用rememberedSet来避免全堆扫描的过程总结如下:

  4. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  5. 深入理解java虚拟机-1.自动内存管理

    文章目录 1.自动内存管理 1.1 Java内存区域与内存溢出异常 1.1.1 运行时数据区域 程序计数器 程序计数器为什么是私有的? java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈为什么是私有的 ...

  6. 我所理解的JVM(六):内存回收

    2019独角兽企业重金招聘Python工程师标准>>> Java的一大特点就是虚拟机本身拥有垃圾回收机制,用户在编程过程中不再需要考虑垃圾回收的事情.所有的对象的创建都是在堆空间中, ...

  7. JVM之Gc基础知识

    在学习垃圾回收器之前,了解垃圾回收的基础理论是十分必要对的,熟悉了基础知识,再学习垃圾回收器就可以轻易的理解. 说起垃圾收集(Garbage Collection,下文简称GC),有不少人把这项技术当 ...

  8. 垃圾回收机制与内存分配策略

    一. 概述   说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史比Java久远,早在1960年诞生于MIT的Lisp这门语 ...

  9. 【JVM系列】读懂Java虚拟机(JVM)这一篇就够了!

    [本文篇幅较长,博主强烈建议收藏阅读(也可关注)]      JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过 ...

最新文章

  1. 8086指令(II)
  2. 《看聊天记录都学不会C语言?太菜了吧》(11)2分钟领悟数组
  3. javaweb---简易邮件发送
  4. hoj2434 going to know him
  5. c语言微秒级延迟程序,C语言中生产随机数及计算运行时间(微秒级)
  6. Java学习笔记之log4j与commons-logging转
  7. 轻量级区块链协议Mina推出对抗性测试网“Testworld”
  8. 11月20日取消纸质车票,怎么报销
  9. Treo 650使用专题及开发计划等
  10. 《人件》(Peopleware)文摘
  11. 微信小程序区分开发版、体验版和正式版
  12. 中国最美的一千个汉字 : 千字文
  13. Codeforces 417 D. Cunning Gena
  14. 病毒防治:清除***从它的寄生地开始
  15. 显示thread 1:signal SIGABRT 错误
  16. 四川教师职称计算机考试试题,四川省中小学教师职称计算机应用能力考试、外语免试审批表.doc...
  17. 用Python对两个数据集中的图像进行水平拼接
  18. 华为云实战 之 对象存储的使用以及与腾讯云COS对比
  19. 图像处理-机器学习一些科普材料汇集 - 持续更新中_拔剑-浆糊的传说_新浪博客...
  20. NRF52840学习历程(四)定时器

热门文章

  1. 基于python网络爬虫的设计和思考
  2. 罗辑思维的「逻辑」问题 - 谈独立思考
  3. 最新版Photoshop 2023(ps2023)特色功能有哪些?
  4. 中国南北分界线上的古镇,有副对联难倒天下客,百年来无人对出
  5. java解析js字典,javaj解析js文件,请问怎么写通用的方法
  6. 游戏原画零基础入门到精通———人体动作你会了吗?
  7. 23种java设计模式之模板模式
  8. Unity技巧:一(成功):在Scene界面wasd按键移动距离设置
  9. python将多帧图片组合成视频
  10. 截取日期,并和现在的时间对比