2012年tcmalloc学习笔记之三
2012年tcmalloc学习笔记之三
A.组织结构
1.线程局部缓存ThreadCache
2.中央数据结构CentralHeap
1.大对象
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
sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf #如果没有这个文件,自己建一个sudo /sbin/ldconfig
修改mysql服务的启动脚本mysqld_safe,在“#executing mysqld_safe”行后添加行:
exportLD_PRELOAD="/usr/local/lib/libtcmalloc.so"
目的是在启动mysql前,加载tcmalloc动态库。
将尺寸小于<=32K的对象,称之为“小对象”。
有划分为170个可分配的尺寸类别。
尺寸类别间隔:
较小的尺寸相差8字节;
较大的尺寸相差16字节;
再大一点的尺寸差32字节,如此类推。
最大的间隔(对于尺寸>=~2K的)是256字节。
一个线程缓存对每个尺寸类都包含了一个自由对象的单向链表。

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