0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ART虚拟机CMC GC算法核心实现介绍

Linux阅码场 来源:deepinthinking 2023-06-28 09:10 次阅读

一、当前GC算法及存在的问题

当前Android(O-T)一直使用的是Concurrent Copy GC算法(CC),该算法通过FromSpace和ToSpace两个空间实现了非常巧妙的Copy机制,算是空间换时间(或者说复杂度),所以在GC的过程中,两个Space会同时被利用,极端情况会占用内存会double。

此外,为了保证GC过程中,访问对象的一致性,还引入的ReadBarrier,ReadBarrier会在访问对象的时候判断对象是否经过了拷贝,如果经过了拷贝需要返回拷贝后在ToSpace中的地址,反之,仍然返回拷贝前的地址。ReadBarrier会对每次对象访问,都插入一次是否访问的判断,即使当前没有在GC也会发生一次判断。这就导致了执行了多余的指令,且在编译结果二进制文件体积的增长。

总结一下,CC主要存在两个问题:

GC过程物理内存徒增又陡降

为保证一致性引入了ReadBarrier

二、新的Concurrent Mark Compact GC算法

Android马上要使能的新算法是Concurrent Mark Compact,简称CMC算法。CMC旨在解决上面介绍的CC算法存在的两个问题,其中最核心的是利用Linux的UFFD特性,并且更新了Allocator算法。

1、UFFD特性介绍

UFFD全称User Fault FD,其核心机制就是,先注册并监控虚拟内存范围的访问,当该范围的内存访问出现异常时,比如SIGBUS错误时,可以把对这块内存页的处理交接给用户空间。

此外,在没有发生SIGBUS错误时,也可以利用UFFD的ioctl特性进行目标内存页的处理。

2、BumpPointerSpace分配器

CMC对应的分配器是BumpPointerSpace,相对RegionSpace其结构更简单,也更利于全局的内存拷贝压缩。

3、GC拷贝压缩的准备工作

在CMC对象初始化的时候,也会初始化跟内存拷贝压缩的相关的数据结构。

在对Heap中对象进行全面遍历标记的时候,会根据对象是否存活,来记录和累加计算其压缩后的地址,还有被压缩后的各个内存页的首个对象,主要的数据结构有:

创建info_map,其中包含:

chunk_info_vec:记录存活对象的大小,所有该容器元素的累加和就是所有存活对象内存的大小。

first_objs_moving_space:会在PrepareForCompaction阶段,记录被压缩后某页的首个对象的源地址。

pre_compact_offset_moving_space:会记录页面被压缩后的地址偏移。

创建compaction_buffers_map:会被用于压缩过程中的页面级别的压缩,作为中转缓存,最后再通过UFFD特性被拷贝到目标地址页面。

① MarkingPhase阶段

该阶段会遍历所有的对象,并在处理存活对象的时候,调用UpdateLivenessInfo函数,该函数主要做了下面两个事情:

SetLiveWords记录存活地址和大小

chunk_info_vec批量记录活跃内存大小

② PrepareForCompaction阶段

该阶段比较重要的是InitMovingSpaceFirstObjects函数。该函数会找出每个需要移动的内存页的第一个对象,并找出这些对象应该被复制到的目标页偏移量

查找第一个live word,使用live_words_bitmap来找出第一个活动字的偏移量,然后计算出第一个活动对象的地址,并将第一个对象的地址和偏移量存储到first_objs_moving_space和pre_compact_offset_moving_space向量中。2.函数进入一个循环,找出每个需要移动的页的第一个对象和偏移量。并将它们存储到first_objs_moving_space和pre_compact_offset_moving_space向量中。

4、单页内存拷贝压缩

单页的拷贝主要是通过调用DoPageCompactionWithStateChange函数实现的,主要包含两个步骤:

CompactPage:拷贝到中转页

CopyIoctl:通过UFFD拷贝中转页到目标页地址

其中,CompactPage压缩的输入和处理过程如下:

输入

first_objs_moving_space[idx]压缩页的第一个对象pre_compact_offset_moving_space[idx]压缩页offset

处理过程

基于live_words_bitmap_来遍历内存页中的存活对象,逐步将数据复制到目标地址到中转页。

5、并行拷贝压缩

上一小节我们介绍了单页拷贝压缩的过程,全局的拷贝一般是从后往前的拷贝的,但是因为CMC也是并行的,所以GC过程中,非GC线程也就是Mutator线程还是会访问对象的。CC算法是通过ReadBarrier实现这个阶段数据一致性的,CMC是通过UFFD触发的SIGBUS特性实现的,也就是当访问一个对象时候,如果还没有被分配就会导致SIGBUS异常,这时候虚拟机会通过UFFD的SIGBUS异常获取缺页的地址,从而触发对应页的拷贝压缩。

总之,我们可以看到会有两种页拷贝和压缩:

GC线程串行压缩和拷贝

Mutator线程通过SIGBUS异常异步触发

而为保证页同时只会被一个线程处理,虚拟机通过ProcessState原子变量(每个页都有一个)保证异步并行,等所有页都被处理完后,GC过程就结束了。

6、其他内容

BlackAllocation(GC过程中新增的分配,被默认为黑色,不进行回收),通过SlidePage处理。

CompactPage和SlidePage中的跨页对象处理。

压缩后FromSpace页的清理等。

三、CMC算法的优缺点

1、优点

GC过程中RSS峰值降低

消除了ReadBarrier,BinarySize减小,Object访问性能提升

2、缺点

一次GC活跃的对象被拷贝两次

暂时没有实现YoungGC

缺页中断产生的时延可能会导致GC过程的性能退化





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分配器
    +关注

    关注

    0

    文章

    176

    浏览量

    25296
  • CMC
    CMC
    +关注

    关注

    0

    文章

    31

    浏览量

    16585

原文标题:ART虚拟机CMC GC算法核心实现介绍

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    虚拟机Ubuntu实现3D效果

    虚拟机Ubuntu实现3D效果
    发表于 08-16 19:58

    虚拟机DNS问题

    我的主机开发板虚拟机本来能互相ping通的。今天我嫌samba服务器刷新慢,按照网上的说明修改虚拟机的/etc/hosts /etc/resolv.conf,拔掉了上网的网线,换成了连接笔记本
    发表于 03-06 18:56

    为什么PC可以ping通虚拟机,但虚拟机ping不通PC?

    我的是笔记本连无线网,开发板通过另一个路由器连接PC,PC IP:192.168.1.100;虚拟机ip:192.168.1.123;板子ip:192.168.1.17遇到的问题:PC可以ping通虚拟机,但虚拟机ping不同P
    发表于 10-25 00:44

    请问一下FORTH虚拟机实现原理和核心实现方法是什么?

      本文基于FORTH语言,以自主构建的JLPFORTH虚拟平台为例,详细阐述FORTH虚拟机实现原理和核心实现方法,模拟和
    发表于 04-20 06:39

    介绍VirtualBox虚拟机的构建方法

    本系列文章将向大家介绍嵌入式系统开发的各方面知识。本文将向大家介绍VirtualBox虚拟机的构建方法。一、什么是虚拟机二、主流虚拟机三、V
    发表于 11-08 06:21

    安装虚拟机

    1、安装虚拟机可以阅读往期文章:Mac苹果电脑安装虚拟机2、在虚拟机上安装CH340驱动,keil4,PZ-ISP,下载CH340驱动安装 下载keil4破解及汉化 下载普中科技烧录软件转载于
    发表于 11-19 08:10

    虚拟机及Ubuntu安装步骤介绍

    嵌入式Linux学习笔记软硬件资源一些概念虚拟机及Ubuntu安装步骤Ubuntu系统入门Shell基本操作常用的Shell命令软硬件资源CPU:I.MX6UL开发平台:Linux开发板:正点原子
    发表于 12-15 08:58

    如何创建虚拟机

    实战开发--开发环境安装(五)1、下载软件vmware和ubuntu-20.04.1-desktop-amd64.iso2、创建虚拟机完整步骤3、安装嵌入式linux所需的工具包4、安装vmware tool,实现虚拟机与物理主
    发表于 12-16 07:45

    介绍SSH软件的安装和ssh软件在主机和虚拟机之间传文件

    学习!!!!文章嵌入式系统设计(一):虚拟机、Ubuntu的安装以及SSH 软件的安装使用:里面详细介绍了SSH软件的安装和ssh 软件在主机和虚拟机之间传文件。文章嵌入式系统设计(二):
    发表于 12-22 08:01

    云计算中能耗和性能感知的虚拟机优化部署算法

    优化虚拟机部署是数据中心降低能耗的一个重要方法。目前大多数虚拟机部署算法都明显地降低了能耗,但过度虚拟机整合和迁移引起了系统性能较大的退化。针对该问题,首先构建
    发表于 11-23 15:43 0次下载

    基于负载预测的虚拟机动态调度算法研究与实现

    了LFS算法,通过虚拟机历史负载数据对虚拟机未来的负载变化情况进行预测,然后根据预测结果对虚拟机进行调度,能够有效地避免云计算系统中高负载物理节点出现,
    发表于 11-24 14:44 9次下载
    基于负载预测的<b class='flag-5'>虚拟机</b>动态调度<b class='flag-5'>算法</b>研究与<b class='flag-5'>实现</b>

    什么是区块链虚拟机和普通虚拟机有啥区别

    区块链技术领域基础设施——虚拟机,是实现智能合约系统最为关键和核心的技术。智能合约不仅是业务逻辑的载体,同时又扎扎实实地落在了技术实现的层面。由此可见,
    发表于 03-04 10:50 4749次阅读

    基于蚁群算法优化的虚拟机放置策略综述

    基于蚁群算法优化的虚拟机放置策略综述
    发表于 06-19 15:27 17次下载

    虚拟机的设计与实现:C\C++

    虚拟机的设计与实现:C\C++
    发表于 02-21 15:10 0次下载

    Docker与虚拟机的区别

    Docker和虚拟机是两种不同的虚拟化技术,它们在实现方式、资源消耗、运行性能等方面存在许多差异。本文将会详细介绍它们的区别。 一、实现方式
    的头像 发表于 11-23 09:37 2406次阅读