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

    文章

    193

    浏览量

    25727
  • CMC
    CMC
    +关注

    关注

    0

    文章

    34

    浏览量

    16720

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

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

收藏 人收藏

    评论

    相关推荐

    什么是虚拟机虚拟机真的那么好用吗?

    在日新月异的科技世界中,虚拟化技术如同一座桥梁,连接着现实与数字的鸿沟,为我们打开了全新的计算维度。虚拟机,这一概念,自其诞生以来,就以其独特的魅力和强大的功能,深深地影响了软件开发、系统测试和云
    的头像 发表于 07-06 08:05 463次阅读
    什么是<b class='flag-5'>虚拟机</b>?<b class='flag-5'>虚拟机</b>真的那么好用吗?

    介绍VirtualBox虚拟机的构建方法

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

    基于虚拟机技术的DSC仿真系统设计

    提出了基于虚拟机技术的DCS仿真系统的实现方式,描述了虚拟控制器的具体实现方法及虚拟机技术的其他应用。
    发表于 12-03 17:26 26次下载
    基于<b class='flag-5'>虚拟机</b>技术的DSC仿真系统设计

    基于虚拟机技术的DCS仿真系统设计与实现

    提出了基于虚拟机技术的DCS仿真系统的实现方式,描述了虚拟控制器的具体实现方法及虚拟机技术的其他应用。
    发表于 01-16 15:04 2155次阅读
    基于<b class='flag-5'>虚拟机</b>技术的DCS仿真系统设计与<b class='flag-5'>实现</b>

    具有可控虚拟机冗余度的启发式分配算法

    在现代基于虚拟化的数据中心中,虚拟机分配是实现云中资源有效调度的首要考虑。已经证明对数据结点分配虚拟机并考虑虚拟机之间的通信延迟,使得最大通
    发表于 11-17 15:17 4次下载
    具有可控<b class='flag-5'>虚拟机</b>冗余度的启发式分配<b class='flag-5'>算法</b>

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

    优化虚拟机部署是数据中心降低能耗的一个重要方法。目前大多数虚拟机部署算法都明显地降低了能耗,但过度虚拟机整合和迁移引起了系统性能较大的退化。针对该问题,首先构建
    发表于 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>

    基于动态调整阈值DTA的虚拟机迁移算法

    针对当前数据中心服务器能耗优化和虚拟机迁移时机合理性问题,提出一种基于动态调整阈值( DAT)的虚拟机迁移算法。该算法首先通过统计分析物理
    发表于 11-27 17:16 0次下载
    基于动态调整阈值DTA的<b class='flag-5'>虚拟机</b>迁移<b class='flag-5'>算法</b>

    检测域划分的虚拟机异常检测算法

    系统的实时性和识别能力,提出基于改进K中心点聚类算法的检测域划分机制,在聚类迭代更新步骤上进行优化,以提升检测域划分的速度,并通过检测域策略的应用来提高虚拟机异常检测的效率和准确率。实验及分析表明,改进的聚
    发表于 12-20 09:48 0次下载

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

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

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

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

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

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

    Docker与虚拟机的区别

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

    怎么安装linux虚拟机

    在计算机领域,虚拟机是一种软件程序,它允许在主操作系统上运行多个虚拟操作系统。Linux虚拟机在开发、测试和学习等环境中得到广泛应用。本文将详细介绍如何安装Linux
    的头像 发表于 11-23 10:50 1067次阅读

    虚拟机ubuntu怎么联网

    与外部网络通信。本文将详细介绍虚拟机Ubuntu的网络连接方法以及一些常见的网络问题解决办法。 一、虚拟机网络概述 虚拟机的网络连接有多种方式,包括桥接模式(Bridge)、NAT模式
    的头像 发表于 12-27 16:51 947次阅读