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

新生代对象垃圾回收如何避免全堆扫描

新生代垃圾回收如何避免全堆扫描:通过卡表 + 写屏障避免全堆扫描
在这里插入图片描述

卡表:
在做YGC的时候,需要判断年轻代里面的对象哪些是垃圾,这些对象可能被老年代的对象引用,
这时候判断年轻代的某个对象是不是垃圾的时候,就需要扫描整个老年代,看有没有老年代的
对象引用指向这个对象。这是一个很恐怖的事情。。。

所以有了Card table。将内存区域分成一个个的card,一个card中包含了多个对象,如果老年代
有一个card中的对象指回了年轻代,则将这个card标记为dirty。
具体哪个card是dirty的,使用一个字节数组来表示(就是一个很长数组,没一个位置要么是0,
要么是1,比如010000,表示1对应的位置的card就是dirty的)。
这样扫描的时候,只需要扫描dirty的card里面的对象。避免全堆扫描。

写屏障:
当老年代的对象指向了新生代的对象,写屏障就会将对应的卡页标记成脏。扫描的时候,只需要扫描脏页里面的对象。避免全堆扫描。
类似于于AOP操作,可以再引用变化之前,或者之后,进行一些额外的操作。

可能存在的问题:产生浮动垃圾。老年代里面的有些对象可能已经是垃圾对象了,那么扫描出来的新生代的对象还是垃圾对象。

==============
卡表:卡表通过将堆内存划分为一系列固定大小的内存块(称为“卡页”),并使用一个字节数组来记录每个卡页的状态(是否包含跨代指针)。1表示包含跨代指针,0表示没有。
当卡页内的对象发生变动,特别是出现了跨代引用的情况的时候,卡表会相应地更新,将涉及的卡页标记为“脏”(Dirty),对应的字节数组位置的值标记为1。这样,在垃圾收集过程中,只需要关注被标记为脏的卡页,而无需扫描整个内存区域,从而提高了垃圾收集的效率。

http://www.lryc.cn/news/475022.html

相关文章:

  • [论文阅读] | 智能体长期记忆
  • Vue2.0 通过vue-pdf-signature@4.2.7和pdfjs-dist@2.5.207实现PDF预览
  • gradle的安装及其配置
  • qt QImage详解
  • 数据分析与效果评估的有效方法与实践探讨
  • Langchain调用模型使用FAISS
  • 双向链表的实现
  • Charles简单压力测试
  • MMSegmentation测试阶段推理速度非常慢的一种可能原因
  • 数据结构之链式结构二叉树的实现(初级版)
  • day01-MybatisPlus
  • Postgresql源码(137)执行器参数传递与使用
  • 韩国恋爱游戏:阿西, 美女室友竟然…?百度网盘下载
  • 一个运维牛人对运维规则的10个总结
  • Istio基本概念及部署
  • 基于 Python 的 Django 框架开发的电影推荐系统
  • 离线数仓开发SQL编写和调试的最佳实践(如何又快又好完成任务,学会几条就不用当很辛苦的牛马)
  • PostgreSQL 增量备份:保护你的数据资产
  • 字节青训-寻找最大葫芦
  • el-checkbox勾选一个变成了勾选所有
  • ExpandingCard扩展卡片
  • 移远通信推出八款天线新品,覆盖5G、4G、Wi-Fi和LoRa领域
  • MySQL 9从入门到性能优化-创建触发器
  • UE5 第三人称学习之动画 control rig
  • C++之--初见模板初阶
  • Nature|用于无线监测颅内信号的植入式柔性超声波传感器(柔性传感/健康监测/植入式电子/水凝胶)
  • 【和AI的《趣味》聊天】01 AI:你找茬是吧(
  • “发放父作业单”是“过数”用例里面的内容吗
  • Linux补基础之:网络配置
  • 【flink】之kafka到kafka