内存管理 - Arena

内存频繁创建和释放的地方一定会有内存池的出现,如在 levelDB 中 im/memtable 组件中,会有大量内存创建(数据的持续 put)和释放(dump到磁盘后释放内存)。其基本原理为:

levelDB 中内存管理的 component 为 Arena,其成员变量在 arena.h 中,log_format.h 中规定其块大小为 4K: kBlockSize=32768

在实现 Arena (arena.cc)中,当内存剩余字节数小于所需分配时,根据所需分配字节是否大于 $kBlockSize/4$ 来确定是否需要使用当前块的剩余字节。

引用计数

levelDB 中,memtable/version 等组件可能被多个线程共享,不能直接删除。而是需要等到无线程占用时,才能删除。

Key 和 Compare

前置知识

  1. SequenceNumber

    递增的 uint64 整数,相同 key 按照其降序,最大值为:

    1
    2
    3
    // We leave eight bits empty at the bottom so a type and sequence#
    // can be packed together into 64-bits.
    static const SequenceNumber kMaxSequenceNumber = ((0x1ull << 56) - 1);

    计算方式: WriteBatch + 1

  2. kValueTypeForSeek

    记录当前操作类型,后续压缩根据这个类型作相应操作

各类 key

dbformat.h

关于 key 的关系表示为:

各类 compare

comparator.h

levelDB 中,通过基类 Comparator 作 key 之间的比较,用于插入 key 和删除 key 的操作。

疑问

  1. DecodeFixed64 是做什么的
  2. seq 和 type 分别用于表示?