ART运行时CompactingGC为新创建对象分配内存的过程分析

上传人:汽*** 文档编号:560212835 上传时间:2022-12-17 格式:DOCX 页数:84 大小:306KB
返回 下载 相关 举报
ART运行时CompactingGC为新创建对象分配内存的过程分析_第1页
第1页 / 共84页
ART运行时CompactingGC为新创建对象分配内存的过程分析_第2页
第2页 / 共84页
ART运行时CompactingGC为新创建对象分配内存的过程分析_第3页
第3页 / 共84页
ART运行时CompactingGC为新创建对象分配内存的过程分析_第4页
第4页 / 共84页
ART运行时CompactingGC为新创建对象分配内存的过程分析_第5页
第5页 / 共84页
点击查看更多>>
资源描述

《ART运行时CompactingGC为新创建对象分配内存的过程分析》由会员分享,可在线阅读,更多相关《ART运行时CompactingGC为新创建对象分配内存的过程分析(84页珍藏版)》请在金锄头文库上搜索。

1、ART运行时Compacting GC为新创建对象分配内存的过程分析在引进Compacting GC后,ART运行时优化了堆内存分配过程。最显著特点是为每个ART运行时线程增加局部分配缓冲区(Thead Local Allocation Buffer)和在OOM前进行一次同构空间压缩(Homogeneous Space Compact)。前者可提高堆内存分配效率,后者可解决内存碎片问题。本文就对ART运行时引进Compacting GC后的堆内存分配过程进行分析。从接口层面上看看,除了提供供常规的对象象分配接口AAllocOObjectt,ART运运行时的堆还还提供了一个个专门用于分分配非移动

2、对对象的接口AAllocNNonMovvableOObjectt,如图1所所示:非移动对象指的的是保存在前前面一篇文章章提到的Noon-Movving SSpace的的对象,主要要包括那些在在类加载过程程中创建的类类对象(Cllass)、类类方法对象(AArtMetthod)和和类成员变量量对象(ArrtFielld)等,以以及那些在经经历过若干次次Generrationnal Seemi-Sppace GGC之后仍然然存活的对象象。前者是通通过AlloocNonMMovablleObjeect接口分分配的,而后后者是在执行行Generrationnal Seemi-Sppace GGC过程移

3、动动过去的。本本文主要关注注通过AlllocNonnMovabbleObjject接口口分配的非移移动对象。 无论是通过过AlloccObjecct接口分配配对象,还是是通过AlllocNonnMovabbleObjject接口口分配对象,最最后都统一调调用了另外一一个接口AlllocObbjectWWithAlllocattor进行具具体的分配过过程,如下所所示:cpp vview pplain copy 在CODEE上查看代码码片派生到我我的代码片class HHeap publicc: . / Alllocattes annd iniitialiizes sstoragge forr a

4、n oobjectt insttance. templlate mirroor:Obbject* AlloocObjeect(Thhread* selff, mirrror:Classs* klaass, ssize_tt num_bytess, coonst PPreFennceVissitor& pre_fencee_visiitor) SSHAREDD_LOCKKS_REQQUIREDD(Lockks:muutatorr_lockk_) retturn AAllocOObjecttWithAAllocaator(self, klasss, nuum_byttes, GetCuurrent

5、tAlloccator(), pre_ffence_visittor); templlate mirroor:Obbject* AlloocNonMMovablleObjeect(Thhread* selff, mirrror:Classs* klaass, ssize_tt num_bytess, coonst PPreFennceVissitor& pre_fencee_visiitor) SSHAREDD_LOCKKS_REQQUIREDD(Lockks:muutatorr_lockk_) retturn AAllocOObjecttWithAAllocaator(self, klass

6、s, nuum_byttes, GetCuurrenttNonMoovingAAllocaator(), pre_ffence_visittor); templlate ALWAYYS_INLLINE mmirrorr:Objject* AlloccObjecctWithhAlloccator( TThreadd* sellf, miirror:Classs* kllass, size_t bytte_couunt, AAllocaatorTyype alllocattor, cconst PreFeenceViisitorr& pree_fencce_vissitor) SSHAREDD_L

7、OCKKS_REQQUIREDD(Lockks:muutatorr_lockk_); AlloccatorTType GGetCurrrentAAllocaator() consst retturn ccurrennt_alllocatoor_; AlloccatorTType GGetCurrrentNNonMovvingAlllocattor() constt retturn ccurrennt_nonn_moviing_alllocattor_; . privatte: . / Alllocattor tyype. AlloccatorTType ccurrennt_alllocatoo

8、r_; constt AlloocatorrType curreent_noon_movving_aallocaator_; . ; 这五个函数数定义在文件件art/rruntimme/gc/heap.h 在Heapp类的成员函函数AlloocObjeect和AlllocNoonMovaableObbject中中,参数seelf描述的的是当前线程程,klasss描述的是是要分配的对对象所属的类类型,参数nnum_byytes描述述的是要分配配的对象的大大小,最后一一个参数prre_fennce_viisitorr是一个回调调函数,用来来在分配对象象完成后在当当前执行路径径中执行初始始化操作,例

9、例如分配完成成一个数组对对象,通过该该回调函数立立即设置数组组的大小,这这样就可以保保证数组对象象的完整性和和一致性,避避免多线程环环境下通过加加锁来完成相相同的操作。 HHeap类的的成员函数AAllocOObjecttWithAAllocaator需要要另外一个额额外的类型为为AlloccatorTType的参参数来描述分分配器的类型型,也就是描描述要在哪个个空间分配对对象。AlllocatoorTypee是一个枚举举类型,它的的定义如下所所示:cpp vview pplain copy 在CODEE上查看代码码片派生到我我的代码片/ Diffferentt typees of alloc

10、catorss. enum AlllocattorTyppe kAlloocatorrTypeBBumpPoointerr, / Use BumpPPointeer alllocatoor, haas enttrypoiints. kAlloocatorrTypeTTLAB, / UUse TLLAB alllocattor, hhas enntrypooints. kAlloocatorrTypeRRosAllloc, / Usse RossAllocc alloocatorr, hass entrrypoinnts. kAlloocatorrTypeDDlMallloc, / Usse d

11、lmmallocc alloocatorr, hass entrrypoinnts. kAlloocatorrTypeNNonMovving, / SSpeciaal alllocatoor forr non movinng objjects, doessnt hhave eentryppointss. kAlloocatorrTypeLLOS, / Laarge oobjectt spacce, allso dooesntt havee entrrypoinnts. ; 这个枚举类类型定义在文文件/artt/runttime/ggc/alllocatoor_typpe.h。 Alloccat

12、orTType一共共有六个值,它它们的含义如如下所示: kAlloocatorrTypeBBumpPoointerr:表示在BBump PPointeer Spaace中分配配对象。 kAlloocatorrTypeTTLAB:表表示要在由BBump PPointeer Spaace提供的的线程局部分分配缓冲区中中分配对象。 kAlloocatorrTypeRRosAllloc:表示示要在Ross Allooc Spaace分配对对象。 kAlloocatorrTypeDDlMallloc:表示示要在Dl Mallooc Spaace分配对对象。 kAlloocatorrTypeNNonMovving:表表示要在Noon Movving SSpace分分配对象。 kAlloocatorrTypeLLOS:表示示要在Larrge Obbject Spacee分配对象。 Heap类类的成员函数数AlloccObjecct和AlllocNonnMovabbleObjject使用用的分配器类类型分别是由由成员变量ccurrennt_alllocatoor_和cuurrentt_non_movinng_alll

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 市场营销

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号