1. HeapBitmap, markStack,CardTable的创建
Dalvik 虚拟机启动流程中的Heap启动流程如下:
std::string dvmStartup(int argc,..) { ... if (!dvmGcStartup()) { return "dvmGcStartup failed"; } ... } bool dvmGcStartup() { ... return dvmHeapStartup(); } bool dvmHeapStartup() { GcHeap *gcHeap; if (gDvm.heapGrowthLimit == 0) { gDvm.heapGrowthLimit = gDvm.heapMaximumSize; } gcHeap = dvmHeapSourceStartup(gDvm.heapStartingSize, gDvm.heapMaximumSize, gDvm.heapGrowthLimit); ... if (!dvmCardTableStartup(gDvm.heapMaximumSize, gDvm.heapGrowthLimit)) { LOGE_HEAP("card table startup failed."); return false; } }
在 dvmHeapStartup 中,我们已经可以看到 CardTable的影子;而Bitmap 和 markStack实际上是在 dvmHeapSourceStartup()之中,GcHeap创建完成之后进行创建的。看代码:
GcHeap* dvmHeapSourceStartup(size_t startSize, size_t maximumSize, size_t growthLimit) { ...//在此之前,GcHeap已经完成malloc if (!addInitialHeap(hs, msp, growthLimit)) { LOGE_HEAP("Can't add initial heap"); goto fail; } if (!dvmHeapBitmapInit(&hs->liveBits, base, length, "dalvik-bitmap-1")) { LOGE_HEAP("Can't create liveBits"); goto fail; } if (!dvmHeapBitmapInit(&hs->markBits, base, length, "dalvik-bitmap-2")) { LOGE_HEAP("Can't create markBits"); dvmHeapBitmapDelete(&hs->liveBits); goto fail; } if (!allocMarkStack(&gcHeap->markContext.stack, hs->maximumSize)) { ALOGE("Can't create markStack"); dvmHeapBitmapDelete(&hs->markBits); dvmHeapBitmapDelete(&hs->liveBits); goto fail; } ... }
至此,这三个数据结构的创建我们都已经看到;
其中,在Heap创建完成后,依次有两个Heapbitmap的创建,分别为"dalvik-bitmap-1" 与 "dalvik-bitmap-2";他们初始化的第一个参数分别为 liveBits 与 markBits;
再次,完成 markStack的创建;最后回到 dvmHeapStartup函数中,再完成了 cardTable的创建。