2012年tcmalloc学习笔记之三
2012年tcmalloc学习笔记之三
1.线程局部缓存ThreadCache
2.中央数据结构CentralHeap
2.小对象
C.测试
1.堆检查器
2.堆测量器
跨度
中央阵列
./configure--disable-cpu-profiler --disable-heap-profiler --disable-heap-checker--enable-minimal –disable-dependency-tracking –disable-debugalloc
目的只生成最小的tcmalloc_minimal
./configure --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
目的只生成最小的tcmalloc_minimal
有划分为170个可分配的尺寸类别。
尺寸类别间隔:
较小的尺寸相差8字节;
较大的尺寸相差16字节;
再大一点的尺寸差32字节,如此类推。
最大的间隔(对于尺寸>=~2K的)是256字节。
一个线程缓存对每个尺寸类都包含了一个自由对象的单向链表。

首先,从该尺寸类别的中央自由列表(中央自由列表是被所有线程共享的)取得一连串对象。
再将他们放入线程局部的自由列表。
将新获取的对象中的一个返回给应用程序。
如果该对象是大对象的话,跨度会告诉我们该对象覆盖的页面的范围。假设该范围是当一个对象被释放的时候,
1.先计算出他的页面号;
2.然后去中央阵列中查找对应的跨度对象。该跨度会告诉我们对象是大对象,还是小对象;
3.如果是小对象,尺寸类别是什么;
4.我们将该类别,插入到当前线程的线程缓存中对应的自由列表中;
5.插入之后,如果线程缓存超过了某个预定的大小(默认为2MB),我们便运行垃圾收集器将未使用的对象从线程缓存中移入中央自由列表。