ART运行时CompactingGC为新创建对象分配内存的过程分析在引进CompactingGC后,ART运行时优化了堆内存分配过程
最显著特点是为每个ART运行时线程增加局部分配缓冲区(TheadLocalAllocationBuffer)和在OOM前进行一次同构空间压缩(HomogeneousSpaceCompact)
前者可提高堆内存分配效率,后者可解决内存碎片问题
本文就对ART运行时引进CompactingGC后的堆内存分配过程进行分析
从接口层面上看,除了提供常规的对象分配接口AllocObject,ART运行时的堆还提供了一个专门用于分配非移动对象的接口AllocNonMovableObject,如图1所示:非移动对象指的是保存在前面一篇文章提到的Non-MovingSpace的对象,主要包括那些在类加载过程中创建的类对象(Class)、类方法对象(ArtMethod)和类成员变量对象(ArtField)等,以及那些在经历过若干次GenerationalSemi-SpaceGC之后仍然存活的对象
前者是通过AllocNonMovableObject接口分配的,而后者是在执行GenerationalSemi-SpaceGC过程移动过去的
本文主要关注通过AllocNonMovableObject接口分配的非移动对象
无论是通过AllocObject接口分配对象,还是通过AllocNonMovableObject接口分配对象,最后都统一调用了另外一个接口AllocObjectWithAllocator进行具体的分配过程,如下所示:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片classHeap{public:
//Allocatesandinitializesstorageforanobjectinstance
templat