一、5种malloc方法
1)tcache_alloc_small
2)arena_malloc_small
3)tcache_alloc_large
4)arena_malloc_large
5)huge_malloc
//written in jemalloc_internal.h file
imalloct(size_t size, bool try_tcache, arena_t *arena)
{
assert(size!= 0);if (size <=arena_maxclass)return (arena_malloc(arena, size, false, try_tcache));else
return (huge_malloc(size, false, huge_dss_prec_get(arena)));
}
JEMALLOC_ALWAYS_INLINEvoid *imalloc(size_t size)
{return (imalloct(size, true, NULL));
}//written in arena.h
JEMALLOC_ALWAYS_INLINE void *arena_malloc(arena_t*arena, size_t size, bool zero, booltry_tcache)
{
tcache_t*tcache;
assert(size!= 0);
assert(size<=arena_maxclass);if (size <=SMALL_MAXCLASS) {if (try_tcache && (tcache = tcache_get(true)) !=NULL)return(tcache_alloc_small(tcache, size, zero));else{return(arena_malloc_small(choose_arena(arena), size,
zero));
}
}else{/** Initialize tcache after checking size in order to avoid
* infinite recursion during tcache initialization.*/
if (try_tcache && size <= tcache_maxclass && (tcache =tcache_get(true)) !=NULL)return(tcache_alloc_large(tcache, size, zero));else{return(arena_malloc_large(choose_arena(arena), size,
zero));
}
}
}
二、malloc时选择arena的机制
1)、先用arenas_tsd_get获得线程绑定变量arena;
2)、如果1)获得值为null,则扫描arenas数组,找到threads number为0或者最小的未卸载的arena;
3)、如果2)中扫描发现存在null插槽,则需要调用arenas_extend进行初始化null插槽;
4)、调用arenas_tsd_set设置线程绑定比变量arena。
//详细见jemalloc.c中函数
arena_t *choose_arena_hard(void)
原文:http://www.cnblogs.com/feika/p/3675711.html