一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ART虛擬機(jī)CMC GC算法核心實(shí)現(xiàn)介紹

Linux閱碼場(chǎng) ? 來源:deepinthinking ? 2023-06-28 09:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、當(dāng)前GC算法及存在的問題

當(dāng)前Android(O-T)一直使用的是Concurrent Copy GC算法(CC),該算法通過FromSpace和ToSpace兩個(gè)空間實(shí)現(xiàn)了非常巧妙的Copy機(jī)制,算是空間換時(shí)間(或者說復(fù)雜度),所以在GC的過程中,兩個(gè)Space會(huì)同時(shí)被利用,極端情況會(huì)占用內(nèi)存會(huì)double。

此外,為了保證GC過程中,訪問對(duì)象的一致性,還引入的ReadBarrier,ReadBarrier會(huì)在訪問對(duì)象的時(shí)候判斷對(duì)象是否經(jīng)過了拷貝,如果經(jīng)過了拷貝需要返回拷貝后在ToSpace中的地址,反之,仍然返回拷貝前的地址。ReadBarrier會(huì)對(duì)每次對(duì)象訪問,都插入一次是否訪問的判斷,即使當(dāng)前沒有在GC也會(huì)發(fā)生一次判斷。這就導(dǎo)致了執(zhí)行了多余的指令,且在編譯結(jié)果二進(jìn)制文件體積的增長(zhǎng)。

總結(jié)一下,CC主要存在兩個(gè)問題:

GC過程物理內(nèi)存徒增又陡降

為保證一致性引入了ReadBarrier

二、新的Concurrent Mark Compact GC算法

Android馬上要使能的新算法是Concurrent Mark Compact,簡(jiǎn)稱CMC算法。CMC旨在解決上面介紹的CC算法存在的兩個(gè)問題,其中最核心的是利用Linux的UFFD特性,并且更新了Allocator算法。

1、UFFD特性介紹

UFFD全稱User Fault FD,其核心機(jī)制就是,先注冊(cè)并監(jiān)控虛擬內(nèi)存范圍的訪問,當(dāng)該范圍的內(nèi)存訪問出現(xiàn)異常時(shí),比如SIGBUS錯(cuò)誤時(shí),可以把對(duì)這塊內(nèi)存頁(yè)的處理交接給用戶空間。

此外,在沒有發(fā)生SIGBUS錯(cuò)誤時(shí),也可以利用UFFD的ioctl特性進(jìn)行目標(biāo)內(nèi)存頁(yè)的處理。

2、BumpPointerSpace分配器

CMC對(duì)應(yīng)的分配器是BumpPointerSpace,相對(duì)RegionSpace其結(jié)構(gòu)更簡(jiǎn)單,也更利于全局的內(nèi)存拷貝壓縮。

3、GC拷貝壓縮的準(zhǔn)備工作

在CMC對(duì)象初始化的時(shí)候,也會(huì)初始化跟內(nèi)存拷貝壓縮的相關(guān)的數(shù)據(jù)結(jié)構(gòu)。

在對(duì)Heap中對(duì)象進(jìn)行全面遍歷標(biāo)記的時(shí)候,會(huì)根據(jù)對(duì)象是否存活,來記錄和累加計(jì)算其壓縮后的地址,還有被壓縮后的各個(gè)內(nèi)存頁(yè)的首個(gè)對(duì)象,主要的數(shù)據(jù)結(jié)構(gòu)有:

創(chuàng)建info_map,其中包含:

chunk_info_vec:記錄存活對(duì)象的大小,所有該容器元素的累加和就是所有存活對(duì)象內(nèi)存的大小。

first_objs_moving_space:會(huì)在PrepareForCompaction階段,記錄被壓縮后某頁(yè)的首個(gè)對(duì)象的源地址。

pre_compact_offset_moving_space:會(huì)記錄頁(yè)面被壓縮后的地址偏移。

創(chuàng)建compaction_buffers_map:會(huì)被用于壓縮過程中的頁(yè)面級(jí)別的壓縮,作為中轉(zhuǎn)緩存,最后再通過UFFD特性被拷貝到目標(biāo)地址頁(yè)面。

① MarkingPhase階段

該階段會(huì)遍歷所有的對(duì)象,并在處理存活對(duì)象的時(shí)候,調(diào)用UpdateLivenessInfo函數(shù),該函數(shù)主要做了下面兩個(gè)事情:

SetLiveWords記錄存活地址和大小

chunk_info_vec批量記錄活躍內(nèi)存大小

② PrepareForCompaction階段

該階段比較重要的是InitMovingSpaceFirstObjects函數(shù)。該函數(shù)會(huì)找出每個(gè)需要移動(dòng)的內(nèi)存頁(yè)的第一個(gè)對(duì)象,并找出這些對(duì)象應(yīng)該被復(fù)制到的目標(biāo)頁(yè)偏移量

查找第一個(gè)live word,使用live_words_bitmap來找出第一個(gè)活動(dòng)字的偏移量,然后計(jì)算出第一個(gè)活動(dòng)對(duì)象的地址,并將第一個(gè)對(duì)象的地址和偏移量存儲(chǔ)到first_objs_moving_space和pre_compact_offset_moving_space向量中。2.函數(shù)進(jìn)入一個(gè)循環(huán),找出每個(gè)需要移動(dòng)的頁(yè)的第一個(gè)對(duì)象和偏移量。并將它們存儲(chǔ)到first_objs_moving_space和pre_compact_offset_moving_space向量中。

4、單頁(yè)內(nèi)存拷貝壓縮

單頁(yè)的拷貝主要是通過調(diào)用DoPageCompactionWithStateChange函數(shù)實(shí)現(xiàn)的,主要包含兩個(gè)步驟:

CompactPage:拷貝到中轉(zhuǎn)頁(yè)

CopyIoctl:通過UFFD拷貝中轉(zhuǎn)頁(yè)到目標(biāo)頁(yè)地址

其中,CompactPage壓縮的輸入和處理過程如下:

輸入

first_objs_moving_space[idx]壓縮頁(yè)的第一個(gè)對(duì)象pre_compact_offset_moving_space[idx]壓縮頁(yè)offset

處理過程

基于live_words_bitmap_來遍歷內(nèi)存頁(yè)中的存活對(duì)象,逐步將數(shù)據(jù)復(fù)制到目標(biāo)地址到中轉(zhuǎn)頁(yè)。

5、并行拷貝壓縮

上一小節(jié)我們介紹了單頁(yè)拷貝壓縮的過程,全局的拷貝一般是從后往前的拷貝的,但是因?yàn)镃MC也是并行的,所以GC過程中,非GC線程也就是Mutator線程還是會(huì)訪問對(duì)象的。CC算法是通過ReadBarrier實(shí)現(xiàn)這個(gè)階段數(shù)據(jù)一致性的,CMC是通過UFFD觸發(fā)的SIGBUS特性實(shí)現(xiàn)的,也就是當(dāng)訪問一個(gè)對(duì)象時(shí)候,如果還沒有被分配就會(huì)導(dǎo)致SIGBUS異常,這時(shí)候虛擬機(jī)會(huì)通過UFFD的SIGBUS異常獲取缺頁(yè)的地址,從而觸發(fā)對(duì)應(yīng)頁(yè)的拷貝壓縮。

總之,我們可以看到會(huì)有兩種頁(yè)拷貝和壓縮:

GC線程串行壓縮和拷貝

Mutator線程通過SIGBUS異常異步觸發(fā)

而為保證頁(yè)同時(shí)只會(huì)被一個(gè)線程處理,虛擬機(jī)通過ProcessState原子變量(每個(gè)頁(yè)都有一個(gè))保證異步并行,等所有頁(yè)都被處理完后,GC過程就結(jié)束了。

6、其他內(nèi)容

BlackAllocation(GC過程中新增的分配,被默認(rèn)為黑色,不進(jìn)行回收),通過SlidePage處理。

CompactPage和SlidePage中的跨頁(yè)對(duì)象處理。

壓縮后FromSpace頁(yè)的清理等。

三、CMC算法的優(yōu)缺點(diǎn)

1、優(yōu)點(diǎn)

GC過程中RSS峰值降低

消除了ReadBarrier,BinarySize減小,Object訪問性能提升

2、缺點(diǎn)

一次GC活躍的對(duì)象被拷貝兩次

暫時(shí)沒有實(shí)現(xiàn)YoungGC

缺頁(yè)中斷產(chǎn)生的時(shí)延可能會(huì)導(dǎo)致GC過程的性能退化





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 分配器
    +關(guān)注

    關(guān)注

    0

    文章

    204

    瀏覽量

    26260
  • CMC
    CMC
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    17006

原文標(biāo)題:ART虛擬機(jī)CMC GC算法核心實(shí)現(xiàn)介紹

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    什么是虛擬機(jī)?虛擬機(jī)真的那么好用嗎?

    在日新月異的科技世界中,虛擬化技術(shù)如同一座橋梁,連接著現(xiàn)實(shí)與數(shù)字的鴻溝,為我們打開了全新的計(jì)算維度。虛擬機(jī),這一概念,自其誕生以來,就以其獨(dú)特的魅力和強(qiáng)大的功能,深深地影響了軟件開發(fā)、系統(tǒng)測(cè)試和云
    的頭像 發(fā)表于 07-06 08:05 ?463次閱讀
    什么是<b class='flag-5'>虛擬機(jī)</b>?<b class='flag-5'>虛擬機(jī)</b>真的那么好用嗎?

    介紹VirtualBox虛擬機(jī)的構(gòu)建方法

    本系列文章將向大家介紹嵌入式系統(tǒng)開發(fā)的各方面知識(shí)。本文將向大家介紹VirtualBox虛擬機(jī)的構(gòu)建方法。一、什么是虛擬機(jī)二、主流虛擬機(jī)三、V
    發(fā)表于 11-08 06:21

    基于虛擬機(jī)技術(shù)的DSC仿真系統(tǒng)設(shè)計(jì)

    提出了基于虛擬機(jī)技術(shù)的DCS仿真系統(tǒng)的實(shí)現(xiàn)方式,描述了虛擬控制器的具體實(shí)現(xiàn)方法及虛擬機(jī)技術(shù)的其他應(yīng)用。
    發(fā)表于 12-03 17:26 ?27次下載
    基于<b class='flag-5'>虛擬機(jī)</b>技術(shù)的DSC仿真系統(tǒng)設(shè)計(jì)

    基于虛擬機(jī)技術(shù)的DCS仿真系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    提出了基于虛擬機(jī)技術(shù)的DCS仿真系統(tǒng)的實(shí)現(xiàn)方式,描述了虛擬控制器的具體實(shí)現(xiàn)方法及虛擬機(jī)技術(shù)的其他應(yīng)用。
    發(fā)表于 01-16 15:04 ?2420次閱讀
    基于<b class='flag-5'>虛擬機(jī)</b>技術(shù)的DCS仿真系統(tǒng)設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    具有可控虛擬機(jī)冗余度的啟發(fā)式分配算法

    在現(xiàn)代基于虛擬化的數(shù)據(jù)中心中,虛擬機(jī)分配是實(shí)現(xiàn)云中資源有效調(diào)度的首要考慮。已經(jīng)證明對(duì)數(shù)據(jù)結(jié)點(diǎn)分配虛擬機(jī)并考慮虛擬機(jī)之間的通信延遲,使得最大通
    發(fā)表于 11-17 15:17 ?4次下載
    具有可控<b class='flag-5'>虛擬機(jī)</b>冗余度的啟發(fā)式分配<b class='flag-5'>算法</b>

    云計(jì)算中能耗和性能感知的虛擬機(jī)優(yōu)化部署算法

    優(yōu)化虛擬機(jī)部署是數(shù)據(jù)中心降低能耗的一個(gè)重要方法。目前大多數(shù)虛擬機(jī)部署算法都明顯地降低了能耗,但過度虛擬機(jī)整合和遷移引起了系統(tǒng)性能較大的退化。針對(duì)該問題,首先構(gòu)建
    發(fā)表于 11-23 15:43 ?0次下載

    基于負(fù)載預(yù)測(cè)的虛擬機(jī)動(dòng)態(tài)調(diào)度算法研究與實(shí)現(xiàn)

    了LFS算法,通過虛擬機(jī)歷史負(fù)載數(shù)據(jù)對(duì)虛擬機(jī)未來的負(fù)載變化情況進(jìn)行預(yù)測(cè),然后根據(jù)預(yù)測(cè)結(jié)果對(duì)虛擬機(jī)進(jìn)行調(diào)度,能夠有效地避免云計(jì)算系統(tǒng)中高負(fù)載物理節(jié)點(diǎn)出現(xiàn),
    發(fā)表于 11-24 14:44 ?9次下載
    基于負(fù)載預(yù)測(cè)的<b class='flag-5'>虛擬機(jī)</b>動(dòng)態(tài)調(diào)度<b class='flag-5'>算法</b>研究與<b class='flag-5'>實(shí)現(xiàn)</b>

    基于動(dòng)態(tài)調(diào)整閾值DTA的虛擬機(jī)遷移算法

    針對(duì)當(dāng)前數(shù)據(jù)中心服務(wù)器能耗優(yōu)化和虛擬機(jī)遷移時(shí)機(jī)合理性問題,提出一種基于動(dòng)態(tài)調(diào)整閾值( DAT)的虛擬機(jī)遷移算法。該算法首先通過統(tǒng)計(jì)分析物理機(jī)
    發(fā)表于 11-27 17:16 ?0次下載
    基于動(dòng)態(tài)調(diào)整閾值DTA的<b class='flag-5'>虛擬機(jī)</b>遷移<b class='flag-5'>算法</b>

    檢測(cè)域劃分的虛擬機(jī)異常檢測(cè)算法

    系統(tǒng)的實(shí)時(shí)性和識(shí)別能力,提出基于改進(jìn)K中心點(diǎn)聚類算法的檢測(cè)域劃分機(jī)制,在聚類迭代更新步驟上進(jìn)行優(yōu)化,以提升檢測(cè)域劃分的速度,并通過檢測(cè)域策略的應(yīng)用來提高虛擬機(jī)異常檢測(cè)的效率和準(zhǔn)確率。實(shí)驗(yàn)及分析表明,改進(jìn)的聚
    發(fā)表于 12-20 09:48 ?0次下載

    什么是區(qū)塊鏈虛擬機(jī)和普通虛擬機(jī)有啥區(qū)別

    區(qū)塊鏈技術(shù)領(lǐng)域基礎(chǔ)設(shè)施——虛擬機(jī),是實(shí)現(xiàn)智能合約系統(tǒng)最為關(guān)鍵和核心的技術(shù)。智能合約不僅是業(yè)務(wù)邏輯的載體,同時(shí)又扎扎實(shí)實(shí)地落在了技術(shù)實(shí)現(xiàn)的層面。由此可見,
    發(fā)表于 03-04 10:50 ?5263次閱讀

    基于蟻群算法優(yōu)化的虛擬機(jī)放置策略綜述

    基于蟻群算法優(yōu)化的虛擬機(jī)放置策略綜述
    發(fā)表于 06-19 15:27 ?17次下載

    虛擬機(jī)的設(shè)計(jì)與實(shí)現(xiàn):C\C++

    虛擬機(jī)的設(shè)計(jì)與實(shí)現(xiàn):C\C++
    發(fā)表于 02-21 15:10 ?0次下載

    Docker與虛擬機(jī)的區(qū)別

    Docker和虛擬機(jī)是兩種不同的虛擬化技術(shù),它們?cè)?b class='flag-5'>實(shí)現(xiàn)方式、資源消耗、運(yùn)行性能等方面存在許多差異。本文將會(huì)詳細(xì)介紹它們的區(qū)別。 一、實(shí)現(xiàn)方式
    的頭像 發(fā)表于 11-23 09:37 ?1.1w次閱讀

    怎么安裝linux虛擬機(jī)

    在計(jì)算機(jī)領(lǐng)域,虛擬機(jī)是一種軟件程序,它允許在主操作系統(tǒng)上運(yùn)行多個(gè)虛擬操作系統(tǒng)。Linux虛擬機(jī)在開發(fā)、測(cè)試和學(xué)習(xí)等環(huán)境中得到廣泛應(yīng)用。本文將詳細(xì)介紹如何安裝Linux
    的頭像 發(fā)表于 11-23 10:50 ?1492次閱讀

    虛擬機(jī)ubuntu怎么聯(lián)網(wǎng)

    與外部網(wǎng)絡(luò)通信。本文將詳細(xì)介紹虛擬機(jī)Ubuntu的網(wǎng)絡(luò)連接方法以及一些常見的網(wǎng)絡(luò)問題解決辦法。 一、虛擬機(jī)網(wǎng)絡(luò)概述 虛擬機(jī)的網(wǎng)絡(luò)連接有多種方式,包括橋接模式(Bridge)、NAT模式
    的頭像 發(fā)表于 12-27 16:51 ?1438次閱讀