jemalloc中按存储单元的块大小分,有region、run、chunk三种存储块。
最小的单元是region,它的大小是8字节~14KB,1个或多个相同大小的region组成一个run。
run的大小必须是页(4kB)的整数倍,相同大小region对应的run的大小总是相同的,多个run组成一个chunk。
chunk的大小固定是2M(或4M,可配置)。
region size | run size | number of region in run |
8 | 4K | 512 |
16 | 4k | 256 |
32 | 4k | 128 |
48 | 12k | 256 |
64 | 4k | 64 |
80 | 20k | 256 |
96 | 12k | 128 |
112 | 28k | 256 |
128 | 4k | 32 |
160 | 20k | 128 |
192 | 12k | 64 |
224 | 28k | 128 |
256 | 4k | 16 |
320 | 20k | 64 |
384 | 12k | 32 |
448 | 28k | 64 |
512 | 4k | 8 |
640 | 20k | 32 |
768 | 12k | 16 |
896 | 28k | 32 |
1024 | 4k | 4 |
1280 | 20k | 16 |
1536 | 12k | 8 |
1792 | 28k | 16 |
2048 | 4k | 2 |
2560 | 20k | 8 |
3072 | 12k | 4 |
3584 | 20k | 8 |
4096 | 4k | 1 |
5120 | 20k | 4 |
6144 | 12k | 2 |
7168 | 28k | 4 |
8192 | 8k | 1 |
10240 | 20k | 2 |
12288 | 12k | 1 |
14336 | 28k | 2 |
相关代码:
arena_bin_info_t arena_bin_info[NBINS]; static void bin_info_init(void) { arena_bin_info_t *bin_info; #define BIN_INFO_INIT_bin_yes(index, size) \ bin_info = &arena_bin_info[index]; bin_info->reg_size = size; bin_info_run_size_calc(bin_info); bitmap_info_init(&bin_info->bitmap_info, bin_info->nregs); #define BIN_INFO_INIT_bin_no(index, size) #define SC(index, lg_grp, lg_delta, ndelta, bin, lg_delta_lookup) \ BIN_INFO_INIT_bin_##bin(index, (ZU(1)<<lg_grp) + (ZU(ndelta)<<lg_delta)) SIZE_CLASSES #undef BIN_INFO_INIT_bin_yes #undef BIN_INFO_INIT_bin_no #undef SC }
gdb中打印arena_bin_info:
(gdb) p je_arena_bin_info $353 = {{ reg_size = 8, redzone_size = 0, reg_interval = 8, run_size = 4096, nregs = 512, bitmap_info = { nbits = 512, ngroups = 8 }, reg0_offset = 0 }, { reg_size = 16, redzone_size = 0, reg_interval = 16, run_size = 4096, nregs = 256, bitmap_info = { nbits = 256, ngroups = 4 }, reg0_offset = 0 }, { reg_size = 32, redzone_size = 0, reg_interval = 32, run_size = 4096, nregs = 128, bitmap_info = { nbits = 128, ngroups = 2 }, reg0_offset = 0 }, { ... }, { reg_size = 12288, redzone_size = 0, reg_interval = 12288, run_size = 12288, nregs = 1, bitmap_info = { nbits = 1, ngroups = 1 }, reg0_offset = 0 }, { reg_size = 14336, redzone_size = 0, reg_interval = 14336, run_size = 28672, nregs = 2, bitmap_info = { nbits = 2, ngroups = 1 }, reg0_offset = 0 }}
region、run、chunk之间的位置关系如下:
时间: 2024-10-01 21:14:38