go内存分配机制-TCMalloc

17freedom · · 796 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

      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语言学习笔记》


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:17freedom

查看原文:go内存分配机制-TCMalloc

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

796 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传