ART运行时CompactingGC为新创建对象分配内存的过程分析.docx
《ART运行时CompactingGC为新创建对象分配内存的过程分析.docx》由会员分享,可在线阅读,更多相关《ART运行时CompactingGC为新创建对象分配内存的过程分析.docx(31页珍藏版)》请在课桌文档上搜索。
1、ART运行时COinPaCtingGC为新创立对象分配内存的过程分析在引进CompactingGC后,ART运行时优化了堆内存分配过程.最显著特点是为每个RT运行时线程增加局局部配缓冲区Thead1.oca1.A1.1.ocationBuffer)和在OOM前进行一次同构空间压缩(HomogeneousSpaceCompact).前者可提高堆内存分配效率,后者可解决内存碎片问璃。本文就对ART运行时引进jStMocNonMftXieCqKtM1.occ(I)MIMtXMIocteor明1ART运行时堆提供的对象分配接口非移动对象指的是保存在前面一倘文章提到的Non-MovingSpace的对象
2、,主要包括那些在类加栽过程中创立的类对象(C1.ass),类方法对象(Ar1.Ne1.hOd)和类成员变量对象(Ar1.Fie1.d等,以及那些在经历过若干次Generationa1.Semi-SpaceGC之后仍然存活的对象.前者是通过A1.IocNonMovab1.eObject接口分配的,而后者是在执行GeneratiOna1.Semi-SpaceCC过程移动过去的.本文主要关注通过AI1.oCNOnMOVab1.eobjeet接口分配的非移动对象,无论是通过AI1.OCObjeCt接口分配对收,还是通过AI1.oeNOnMOVabIeObjeCt接口分配对象.蜃后都统一时用了另外一个接
3、口AnOCObjeCeithA1.IOCatorj5行具体的分配过程,如下所示:cppviewp1.aincopy在CoDE上杳看代玛片派生到我的代码片c1.assHeap(pub1.ic:/A1.1.ocatesandinitia1.izesstorageforanobjectinstance.temp1.atemirror:Object*A1.IocObject(Thread*se1.f,mirror:C1.ass*k1.ass,sizenu111.bytes,constPreFenceVisitorftPrjrenCe_ViSi1.Or)SI1.ARED_1.OCKS_REQUIRED(
4、1.oCks:BUtatorOCkj(returnA1.IocObjectBithA1.1.ocator(se1.f,k1.ass,num_bytes,GetcurrentA1.IocatorO,PrCjenCe_viSitor):temp1.atemirror:Object*1.IocNonMovab1.cObject(Threadse1.f,mirror:zC1.assk1.ass9sizetnumbytes,constPreFenceVisitorApre_fence_visitor)SHARED1.oCKS_REQUIRED(1.oCkS:BUIaI。J1.OCk_)(return1.
5、IocObjectUithj1.1.ocator(se1.f.k1.ass.num_bytes.GetCurrentNonMoving11.ocatorO,pre_fencevisitor);)temp1.ateA1.WRYS,N1.1NEmirror:ObjeC1.*A1.IocObjectWithA1.1.ocator(Thread*se1.fBirrornC1.ass*k1.ass1size_tbyte_coun1.A1.1.ocatorTypea1.1.ocator,constPreFenceVisitorftpre_fence_visitor)SHARED1.()CKS_REQUIR
6、EI)(1.ocks:mitator_IockJ;A1.1.ocatorTypcGetCurrentA1.IocatorOconst(returncurrent-a1.1.ocator-;)A1.1.ocatorTypcGetCurreniNonMovirgA11.ocatorOconstreturncurrent_non_moving_a1.1.ocator_;private:/1.1.ocatortype.A1.IocatorTypecurrent_a1.1.ocator_;constA1.1.ocatorTypecurrent_non_moving_a1.1.ocator);这五个函数定
7、义在文件art/runtime/gc/heap.h6:Heap类的成员函数AI1.OCobjeCt4JA1.IocNonMovab1.eObject中.参数Se1.f描述的是当前线程.k1.ass描述的是要分泥的对软所M的类型,参数num.bytes描述的是要分北的对弦的大小.最后一个参数pre_fence_visitor是一个回调函数,用来在分配时象完成后在当前执行路径中执行初始化操作,例如分配完成一个数组对象,通过该回调函数立即设置数组的大小,这样就可以保证数组对象的完整性和一致性,防止多线程环境下通过加馈来完成相同的操作。Heap类的成反函数A1.1.ocObjectWithA1.1.o
8、cator需要另外,个额外的类型为AIIOCatOrTyPe的卷数来描述分配涔的类里,也就是描述要在物个空间分配对象CA1.1.oMIorTyW是一个枚举类型,它的定义如卜所示,cppviewp1.aincopy在CoDE上查看代码片派生到我的代码片/Differenttypesofa1.1.ocators.enim1.IocatorTypek1.IocatorTypeBuffpPointer,/UseBvmpPointera1.1.ocator,hasentrypoints.kA1.IocatorTypeT1.AB1./UseT1.ABa1.1.ocator,hasentrypoints.k
9、j1.IocatorTypeRosA1.1.oc,/UseRos1.Ioca1.1.ocator,hasentrypoints.k1.IocatorTypeD1.Ha1.1.oc,/Used1.ma1.1.ex:a1.1.ocator,hasentrypoints.kA1.IocatorTypeXMip.i11g,/Specia1.a1.1.ocatorfornon11.ingobjects,doesnthaveentrypoints.kA1.IocatorType1.XIS,/1.argeobjectspace,a1.sodoesn,thaveen1.rypints.):这个枚举类型定义在文
10、件/artrunti三gc1.1.ocatortype,hA1.1.ocatorType一共有六个伯,它In的含义如下所示:kA1.IocatorTypcBuinpPointer:表示在BUITPPointerSPHCR中分配对象.kA1.IocatorTypeT1.AB:我示要在由RUmPPointerSPaCe提供的畿程同同部配缓冲区中分配时象。k1.IocatorTypeRosA1.1.oc:表示要在RoS.M1.ocSPHCo分配对kA1.IocatorTypeD1.Ma1.1.oc:表示要在D1.Ma1.1.ocSPaCe分配对象。kA1.IocatorTypeNonMoving:表
11、示要在卜OnMovingSPHCe分配对象.kA1.IocaiorTypc1.OS:表示要在1.argCObjectSPaCC分配时象。Heap类的成员函数A1.1.ocObject和A1.IocNonMovab1.eObject使用的分配器类型分别是由成员变量currenta1.1.ocatorcurrentnonmoving_a1.1.ocator决定的前者的(ft与当前使用的GC类型有关当GC类型发生变化时,就会调用HeaP类的成员函数ChangeCoueCIor来修改当前使用的GC,【可时也会调用月外一个成员函数ChangoA1.1.ocator来修改Heap类的成员变用current
12、_aI1.ocator的值。由于ART运行时只有一个NonMovingSpace.因此后存的Gi就固定为kA1.IociitorTypoMonMoving.Heap类的成员函数ChangeCoIIeeIor的实现如下所示:cppviewp1.aincopy在CODE上查看代码片派生到我的代码片voidHeap:ChangeCo1.Iector(Co1.IectorTypeco1.1.ectortype)./TODO:On1.ydothiswitha1.1.三utatorssuspendedtoavoidraces.if(co1.Icc1.oj1.ypc!=co1.1.ector_type_)c
13、o1.1.ector_type_=co1.1.ector_type;gc_p1.an_.c1.ear();switch(co1.1.ccior_1.ype_)(casekCo1.IectorTypeCC:/Fa1.1-through.casekCo11ectorTypeMC:/Fa1.!-through.casekCoI1.ectorTypeSS:/Fa1.1.-through.MSekCo1.IoctorTypeGSS:gc_p1.an_.push_back(co1.1.ector:ZkGcTypeFu1.1.);if(use-t1.ab_)ChangeA1.1.ocator(kA1Ioca
14、torTypeT1.AB):e1.seChangeAI1.ocator(kAIIocatorTypeBumpPointer):Ibreak;casekCo11ectorTypeHS:(gc_p1.an_.ush_back(co1.1.ector:kGcTypcSticky);gc_p1.an_.pushback(co1.1.ector:ZkGcTypePartia1.);gc_p1.an_.PUSh_back(co1.1.ector:ZkGcTypeFu1.1.):ChangeA1.1.ocator(kVseRosA1.Ioc?kA1.IocatorTypeRosA1.Ioc:kA1Iocat
15、orTypeD1.Ma11.oc);break;casekCo11ectorTypoCS:gc_p1.an_.push_back(co1.1.ector:ZkGcTypeSticky);gc_p1.an_.push.back(co1.1.ector:RGcTypePariia1.):gc_p1.an_.push_back(co1.1.ector:ZkGcTypeFu1.1.);ChangeA1.1.ocator(k1.seRos1.Ioc?kA1.IocatorTypeRosA1.1.oc:kA1.IocatorTypeD1.Ma1.1.oc);break;defau1.t:I.OG(FATA
16、1.)*Unimp1.emented*;这个函数定义在文件imecheap.cc中。从这里我们就可以看到.对于CompactingGa它们使用的分配器类型只可能为kMIocHtorTypE1.AB或ffkA1.IocatorTypeBuiipPointer.取决定HeaP类的成员变质USeIIab_的IftCHCaP类的成员变显USeIIab的默认为fa1.se,但是可以通过ART运行时启动选项-XX:USenAB来设置为true,对于Mark-S谭eepGC来说,它们使用的分配器类型只可能为kA1.IocatorTypcRosA1.1.oc或者1.M1.ocatorTypcD1.Ma1.Io
17、c.取决于常量k1.cRosA1.Ioc的值。此外,我们还可以看到,根据当前使用的GC不同,Hcap类的成员变呆gc会被设置为不同的侑,用来衣示在分配对象过程中遇到内存缺乏时,应该执行的GC粒度,对于CgPHCIiMGC来说,只有一种GC粒度可执行那就是kGcTypeFu1.1.实际上就是说对BumpPointerSpace的所有不可达对望进行回收.时干北nkSweepGC来说,有三种GC粒度可执行,分别是IcGcTypeSticky、kGcTypePartia1.R1.kGcTypeFu1.1.这三者的含义可以卷考前面一文。后面我们继续对象分配过程时,也可以荷到HCaI)类的成员变疑gc1.
18、an_的用途。Heap类的成员函数ChIIngc1.1.ocator的实现如下所示:cppviewp1.aincopy在CoDE上查看代码片派生到我的代码片voidHeap:ChangcA1.Iocator(A1.IocatorTypca1.1.ocator)if(current_a1.1.ocator-!=a1.1.ocator)(current_a1.1.ocator=a1.1.ocator;Mutex1.-ockmu(nu1.1.ptr,*1.x)cks:runti三?shutdownIockJ;SetQuickA1.IocEntryPointsA1.Iocator(currenta1.
19、1.ocatorJ;这个函数定义在文件ime/gc/heap.CC中。Heap类的成员函数ChangeA1.1.ocator除了设置成员变!currenta1.1.ocator的值之外,还会调用函数SetQuickA1.IocEntryPointsA1.1.ocator来修改提供应NativeCode的用来分配对象的入口点函数以便NativeCOdo可以在ART运行时切换GC时使用正常的接口来分泥时缸这里所谓的NativeCode,就是APK在安装时通过附译DEX字节码得到的本地机器指令。了解了分配器的类型之后,接下来我们就继续分析HaP类的成员函数A1.1.。CObjUcIWithAuoCa
20、tOr的实现,如下所示:cppviewp1.aincopy在CoDE上查看代码片派生到我的代码片temp1.atein1.ine三irror:Object*Heap:A1IocObjectWithA1.1.ocator(Thread*se1.f,mirror:C1.ass*k1.ass.sizebyte_count,A1.IocatorTypea1.1.ocator,constPreFenccVisi1.oripre_fence-visi1.or)if(kCheck1.arge()bject&IN1.IKEI.Y(ShouId1Ioc1.argeObject(k1ass,byte_count)
21、returnA11Oc1.argeObjectkInstru三ente(se1.f,k1.ass,byte_count,prc_fence_visitor):)mirror:Object*obj;if(a1.1.ocator=kA1.Ioca1.orTypeT1.AB)byte_count-Round1.Ip(byte_count,space:BumpPointerSpace:kA1.ignment):)if(a1.1.ocator=kA1.1.ocatorTyeT1.AB&byte.countT1.abSize()obj=sc1.f-A1.IocT1.ab(by1.e_count);obj-
22、SetC1.ass(k1ass);pre_fence-visitor(bjUSab1.c_SiZC);)e1.se(obj=TryToA1.1.ocatek1.nstrumente(se1.f,a1.1.ocator,byte_count.&!ytes_a1.1.ocated,&usab1.c_sizc):if(UN1.IKE1.Y(obj=nu1.1.ptr)boo1.is_current_a1.1.ocator=a1.1.ocator=GetCurrentA1.IocatorO;obj=A1.IocateInterna1.WithGc(se1.f,a1.1.ocator,byte_coun
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ART 运行 CompactingGC 创建 对象 分配 内存 过程 分析

链接地址:https://www.desk33.com/p-1677833.html