allocateNode()分配节点为什么从0层开始往下查询空闲节点?

来源:7-12 page 级别内存分配

鋒Nic

2018-06-27

private int allocateNode(int d) {
    int id = 1;
    int initial = - (1 << d); // has last d bits = 0 and rest all = 1
    byte val = value(id);
    if (val > d) { // unusable
        return -1;
    }
    while (val < d || (id & initial) == 0) { // id & initial == 1 << d for all ids at depth d, for < d it is 0
        id <<= 1;
        val = value(id);
        if (val > d) {
            id ^= 1;
            val = value(id);
        }
    }
    byte value = value(id);
    assert value == d && (id & initial) == 1 << d : String.format("val = %d, id & initial = %d, d = %d",
            value, id & initial, d);
    setValue(id, unusable); // mark as unusable
    updateParentsAlloc(id);
    return id;
}

在分配节点的时候已经知道节点所在的层级深度,为什么还要从0层开始往下查询空闲节点呢?这步不是很多余吗?比如分配16K,那直接在第10层去查询空闲节点即可嚒?

写回答

1回答

闪电侠

2018-06-27

从指定层开始遍历找一个空闲的内存块是一个线性搜索的过程,平均时间复杂度为O(n),而从底层开始查找,树形结构,时间复杂度为O(lgn),树形结构相当于是批量遍历
一个简单的例子:chunk左半边内存全部被使用,右半边是空闲的,树形结构只需要遍历一个层数就行,而到指定层遍历得把左边的小空闲块全遍历一遍才能找到空闲块

1
0

Java读源码之Netty深入剖析

解析netty各大组件细节,百万级性能调优,设计模式实际运用

2334 学习 · 283 问题

查看课程