Dalvik虚拟机GC之 HeapBitmap ,GcMarkStack 与 CardTable


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的创建。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值