Revision History
Table of Contents
1. Introduction
1.1. 主要内容
1.2. 介绍
2. Jemalloc的数据结构
2.1. 配对堆Pairing Heap
2.1.1. phn_merge_ordered
2.1.2. ph_merge_siblings
2.1.3. ph_merge_aux
2.1.4. ph_merge_children
2.1.5. a_prefix##first
2.1.6. a_prefix##insert
2.1.7. a_prefix##remove_first
2.1.8. a_prefix##remove
2.1.9. 配对堆在jemalloc中的使用
2.2. bitmap的两种实现
2.2.1. 什么时候使用bitmap TREE
2.2.2. bitmap TREE设计
2.2.3. bitmap_sfu的处理过程
2.2.4. bitmap初始化过程
2.2.5. bitmap_info初始化过程
2.2.6. bitmap_full检测
2.2.7. bitmap_set
2.2.8. bitmap_sfu
2.3. radix tree 基数树
2.3.1. radix tree的level和对应的subtree结构
2.3.2. radix tree头文件定义
2.3.3. radix tree在jemalloc的实现
2.3.4. radix tree gdb 数据
2.4. red-black tree 红黑树
2.4.1. AVL 失去平衡后的4种姿态
2.4.2. AVL 旋转
2.4.3. RB TREE定义
2.4.4. RB TREE 插入过程
2.4.5. RB TREE删除过程
2.5. Ring definitions双向循环链表
2.5.1. Ring在jemalloc中的使用
2.6. List definitions双向链表
2.6.1. List definitions在jemalloc中的使用
2.7. PRNG线性同余伪随机数生成器和原子操作的使用
2.7.1. 原子操作的使用
2.7.2. 线性同余伪随机数生成器
3. Tcache 实现原理
3.1. TSD:thread specific data 线程局部存储
3.2. Tcache和arena的关系
3.3. Tcache的定义
3.4. Tcache的结构
3.5. Tcache boot与初始化
3.6. Tcache fill过程
3.7. Tcache的分配过程
3.8. Tcache的回收flush过程
3.9. Android 对TCACHE_NSLOTS_SMALL_MAX配置问题
4. Jemalloc的参数和调试相关
4.1. Jemalloc的调试开关
4.1.1. JEMALLOC_DEBUG
4.1.2. JEMALLOC_FILL
4.1.3. JEMALLOC_TCACHE
4.2. Android里Jemalloc的初始化参数
4.2.1. Arena数量
4.2.2. LG_SIZEOF_PTR
4.2.3. NBINS
4.2.4. Chunk size大小
4.2.5. Tcache 相关配置
4.3. Jemalloc参数初始化
4.3.1. 以LG_开始的宏常量定义
4.3.2. map_bias的初始化
4.4. Jemalloc的统计输出
5. Jemalloc多核/多线程分配和互斥锁
5.1. 锁的分类
5.2. Tcache分配的过程
5.3. 从bin的runcur中的分配过程
5.4. 从bin的runs中的分配过程
5.5. arena->runs_avail[i] 中的分配过程
5.6. new chunk的分配过程
6. Region size设计以及和index对应关系
6.1. Region size步长的设计
6.2. Region相关的参数定义(anrdoid 64bits)
6.3. SIZE_CLASSES 定义
6.4. size2index_tab (用于reg_size 小于4096的快速查找)
6.5. size2index_compute的计算过程
6.6. index2size_compute的计算过程
6.7. 步长增加规律分析-浪费率控制
6.8. index2size_tab
7. Jemalloc内存分配释放过程
7.1. 从arena中分配small size内存的过程
7.1.1. tcache中的分配过程
7.1.2. 从bin的runcur中的分配过程
7.1.3. 从bin的runs,arena->runs_avail[i],new chunk的分配过程
7.1.4. 从arena bin的分配debug过程
7.2. small size内存的释放过程
7.2.1. 释放内存到tcache的过程
7.2.2. 如果tcache已满,释放一半tcache回各自的run
7.2.3. 如果run已满,释放回arena->runs_avail[i]
7.2.4. 如果chunk已满,释放chunk 回arena->spare
7.2.5. 如果arena->spare已保存前面释放的chunk,则释放spare的chunk
7.3. 从arena中分配large size内存的过程
7.3.1. tcache分配过程
7.3.2. 非tcache的分配过程
7.4. large size内存的释放过程
7.4.1. 释放large内存到tcache的过程
7.4.2. 如果tcache已满,释放一半tcache回arena->runs_avail[i]
7.4.3. 如果chunk已满,释放chunk 回arena->spare
7.4.4. 如果arena->spare已保存前面释放的chunk,则释放spare的chunk
7.5. 从arena中分配huge size内存的过程
7.6. huge size内存的释放过程
8. Chunk
8.1. Chunk结构 (9832E 64位系统)
8.2. Chunk分配过程
8.3. 根据内存地址对chunk头的进一步分析
8.4. map_bits
8.5. map_misc_t
8.6. 从arena找到chunk地址
8.7. Chunk 的register过程
9. jemalloc存储块(region、run、chunk)
9.1. 存储块(region、run、chunk)
9.2. arena_bin_info
9.3. arena_bin_info中的bitmap_info
10. Jemalloc的初始化过程
11. Jemalloc的异常行为?
11.1. Free(P+n)释放部分空间的问题
12. Jemalloc unit test
12.1. Jemalloc的unit test设计
12.2. RB tree的unit test设计
12.3. 和unit test配套的强壮的assert设计
13. Jemalloc 不相关问题
13.1. 32/64位系统数据类型对应字节数
13.2. Assert的使用
13.3. 0xFFLU和0xFFU
13.4. 堆排序
13.5. typedef struct的使用
13.6. big-endian和little-endian格式
14. 参考资料