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

上传人:王** 文档编号:1630211 上传时间:2024-11-25 格式:DOCX 页数:31 大小:139.49KB
下载 相关 举报
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第1页
第1页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第2页
第2页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第3页
第3页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第4页
第4页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第5页
第5页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第6页
第6页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第7页
第7页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第8页
第8页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第9页
第9页 / 共31页
ART运行时CompactingGC为新创建对象分配内存的过程分析.docx_第10页
第10页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 文学/艺术/历史 > 民俗传统

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!