本教材由知了传课辛苦制作而成,仅供学习使用,请勿用于商业用途!如进行转载请务必注明出处!谢谢!

内存分配机制

TCMalloc

Google 为 C 语言开发的一种内存管理算法

1.介绍

把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。

优势:

  • 比glibc 2.3 malloc更快,glibc有个ptmalloc2独立库,完成一次malloc需要300ns左右,tcmalloc只需50ns
  • 小对象没有锁的操作,没有锁冲突;大对象使用更加高效的自旋锁(spinlock)循环请求,减少锁冲突
  • 使用线程本地缓存来存储预分配的内存对象(thread-lock cache),小的对象可以直接分配到线程本地缓存(<=32KB的为小对象

2.分配过程

将内存空间分成了不同尺寸大小的块,申请内存时会分配一个合适大小的内存

  • 大对象
会从mheap上直接申请内存,单位是页(4k),大对象占用的是若干页,为空从操作系统申请
  • 小对象
每个小对象按照大小会被映射到大概170不同的大小类型,比如1024左右大小的会找到最接近的大小,即1024字节

3.回收过程

线程缓存垃圾回收

  • 当线程缓存中所有空闲对象的大小超过2MB的时候,垃圾回收期会自动进行回收,线程数增加时候,垃圾回收的阈值会减少以避免内存的浪费。

  • 遍历缓存中的所有空闲链表,从中移动L/2个对象到对应的中央链表中。L记录了自从上一次垃圾收集操作之后本链的最小长度。如果一个线程停止使用某个特定大小的对象,该大小的所有对象将会很快的从线程缓存中迁移到中央空闲链中,以便被其他线程来使用。

1443人已阅读,今天你学习了吗?

添加新回复