golang的内存采用了TCMalloc 这种分配机制。go是在多种语言诞生N多年之后,才由几个大神开发的。每种语言都有自己的内存分配机制,那么作为后起之秀,go为什么选用TCMalloc呢?因为TCMalloc(Thread-Cache Malloc) 在内存分配上性能做的更好,而且对内存的利用率也有所提高。先简单说一下TCMalloc在这两方面是如何做到的?
- 性能提升主要从两点来看,第一点线程内部小对象的使用不存在锁竞争,减少了竞争带来的性能开销; 第二点内存大对象的分配直接在堆上,并且采用了自旋锁,某个线程等待另一个线程释放锁的时候,不会像传统互斥锁一样由运行态转到休眠态,等待线程一会处于忙等待,减少了线程状态的切换。
- 在内存利用率方面,区分了线程、central、heap三级,线程之间有一个共享内存池(central 区)。当线程内部内存不足时,会向central申请,当不再使用时,归还到central区。每个线程都可以向central区申请和归还,充分利用了内存。central区内存不足时,跟heap申请,空闲时归还给heap。
说了分配性能跟内存利用率方面的优势,有没有对TCMalloc产生浓浓的兴趣?
本文将从如下几个方面,将我整理的知识点梳理一下:
- TCMalloc内存块以及管理组件
- go初始化时,在内存这部分做了什么?
- TCMalloc 分配过程
- TCMalloc 回收过程
1 TCMalloc内存块以及管理组件
2 go初始化时,在内存这部分做了什么?
3 TCMalloc 分配过程
4 TCMalloc 回收过程
参考文献
1、官方文档
2、自旋锁
3、《go语言学习笔记》
有疑问加站长微信联系(非本文作者)