zoukankan      html  css  js  c++  java
  • PoolSubpage

    概述(Motivation)

    使用位图的方式管理一段内存,用于管理小内存的。

    实现细节(Modification)

    将一个page等分分成多个elem,利用long位图进行管理

    构造函数

    PoolSubpage(PoolSubpage<T> head, PoolChunk<T> chunk, int memoryMapIdx, int runOffset, int pageSize, int elemSize) {
        this.chunk = chunk;
        this.memoryMapIdx = memoryMapIdx;
        this.runOffset = runOffset;
        this.pageSize = pageSize;
        bitmap = new long[pageSize >>> 10]; // pageSize / 16 / 64
        init(head, elemSize);
    }
    
    void init(PoolSubpage<T> head, int elemSize) {
        doNotDestroy = true;
        this.elemSize = elemSize;
        if (elemSize != 0) {
            maxNumElems = numAvail = pageSize / elemSize;
            nextAvail = 0;
            // 一个long64位,多少个long就够,&63向上取整
            bitmapLength = maxNumElems >>> 6;
            if ((maxNumElems & 63) != 0) {
                bitmapLength ++;
            }
    
            for (int i = 0; i < bitmapLength; i ++) {
                bitmap[i] = 0;
            }
        }
        addToPool(head);
    }
    
    • 默认初始化bitmap长度为8,这里解释一下为什么只需要8个元素:其中分配内存大小都是处理过的,最小为16,说明一个page可以分成8192/16 = 512个内存段,一个long有64位,可以描述64个内存段,这样只需要512/64 = 8个long就可以描述全部内存段了。
    • init根据当前需要分配的内存大小,确定需要多少个bitmap元素,实现如下:

    分配函数

        /**
         * Returns the bitmap index of the subpage allocation.
         */
        long allocate() {
            if (elemSize == 0) {
                return toHandle(0);
            }
    
            if (numAvail == 0 || !doNotDestroy) {
                return -1;
            }
    
            final int bitmapIdx = getNextAvail();
            int q = bitmapIdx >>> 6;
            int r = bitmapIdx & 63;
            assert (bitmap[q] >>> r & 1) == 0;
            bitmap[q] |= 1L << r;
    
            if (-- numAvail == 0) {
                removeFromPool();
            }
    
            return toHandle(bitmapIdx);
        }
    
    1. 方法getNextAvail负责找到当前page中可分配内存段的bitmapIdx;
    2. q = bitmapIdx >>> 6,确定bitmap数组下标为q的long数,用来描述 bitmapIdx 内存段的状态;
    3. bitmapIdx & 63将超出64的那一部分二进制数抹掉,得到一个小于64的数r;
    4. bitmap[q] |= 1L << r将对应位置q设置为1;

    综述(Result)

    占小狼

  • 相关阅读:
    Spring之配置文件bean作用域的详细介绍
    Spring之hello world(Spring入门)
    Spring的控制反转和依赖注入
    c3p0和QueryRunner的结合使用,让开发更加简便
    C3p0数据库连接池的使用
    Hibernate的核心对象关系映射
    Hibernate的主配置文件hibernate.cfg.xml
    鼠标移到导航上面 当前的LI变色 处于当前的位置
    CSS3背景渐变属性 linear-gradient(线性渐变)和radial-gradient(径向渐变)
    【转】Android中dip(dp)与px之间单位转换
  • 原文地址:https://www.cnblogs.com/GrimReaper/p/10385336.html
Copyright © 2011-2022 走看看