《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:kA1IocatorTypeD1.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