go 内存分配,和 tcmalloc 的区别?
Go内存管理与tcmalloc最大的不同在于,它提供了逃逸分析和垃圾回收机制。(逃逸分析见168等、垃圾回收见618等) 参考解析
题目来源:shopee、小米
答案:peace
go 内存分配核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。
- Go在程序启动时,会向操作系统申请一大块内存,之后自行管理。
- Go内存管理的基本单元是mspan,它由若干个页组成,每种mspan可以分配特定大小的object。
- mcache, mcentral, mheap是Go内存管理的三大组件,层层递进。mcache管理线程在本地缓存的mspan;mcentral管理全局的mspan供所有线程使用;mheap管理Go的所有动态分配内存。
- 极小的对象(<=16B)会分配在一个object中,以节省资源,使用tiny分配器分配内存;一般对象(16B-32KB)通过mspan分配内存;大对象(>32KB)则直接由mheap分配内存。
tcmalloc
tcmalloc 是google开发的内存分配算法库,最开始它是作为google的一个性能工具库 perftools 的一部分。TCMalloc是用来替代传统的malloc内存分配函数。它有减少内存碎片,适用于多核,更好的并行性支持等特性。
TC就是Thread Cache两英文的简写。它提供了很多优化,如:
1.TCMalloc用固定大小的page(页)来执行内存获取、分配等操作。这个特性跟Linux物理内存页的划分是不是有同样的道理。
2.TCMalloc用固定大小的对象,比如8KB,16KB 等用于特定大小对象的内存分配,这对于内存获取或释放等操作都带来了简化的作用。
3.TCMalloc还利用缓存常用对象来提高获取内存的速度。
4.TCMalloc还可以基于每个线程或者每个CPU来设置缓存大小,这是默认设置。
5.TCMalloc基于每个线程独立设置缓存分配策略,减少了多线程之间锁的竞争。
Go中的内存分类并不像TCMalloc那样分成小、中、大对象,但是它的小对象里又细分了一个Tiny对象,Tiny对象指大小在1Byte到16Byte之间并且不包含指针的对象。小对象和大对象只用大小划定,无其他区分。
Go内存管理与tcmalloc最大的不同在于,它提供了逃逸分析和垃圾回收机制。(逃逸分析见168等、垃圾回收见618等)