TCMalloc 内存分配原理简析
一、TCMalloc
TCMalloc简介
为啥要介绍 TCMalloc?
因为golang的内存分配算法绝大部分都是来自 TCMalloc,golang只改动了其中的一小部分。所以要理解golang内存分配算法,就要先了解下TCMalloc,为后面分析golang内存做一做功课。
tcmalloc 是google开发的内存分配算法库,最开始它是作为google的一个性能工具库 perftools 的一部分。TCMalloc是用来替代传统的malloc内存分配函数。它有减少内存碎片,适用于多核,更好的并行性支持等特性。
前面TC就是Thread Cache两英文的简写。
它提供了很多优化,如:
- TCMalloc用固定大小的page(页)来执行内存获取、分配等操作。这个特性跟Linux物理内存页的划分是不是有同样的道理。
- TCMalloc用固定大小的对象,比如8KB,16KB 等用于特定大小对象的内存分配,这对于内存获取或释放等操作都带来了简化的作用。
- TCMalloc还利用缓存常用对象来提高获取内存的速度。
- TCMalloc还可以基于每个线程或者每个CPU来设置缓存大小,这是默认设置。
- TCMalloc基于每个线程独立设置缓存分配策略,减少了多线程之间锁的竞争。
TCMalloc架构简图
Front-end:
它是一个内存缓存,提供了快速分配和重分配内存给应用的功能。它主要有2部分组成:Per-thread cache 和 Per-CPU cache。Middle-end:
职责是给Front-end提供缓存。也就是说当Front-end缓存内存不够用时,从Middle-end申请内存。它主要是 Central free list 这部分内容。Back-end:
这一块是负责从操作系统获取内存,并给Middle-end提供缓存使用。它主要涉及 Page Heap 内容。
TCMalloc将整个虚拟内存空间划分为n个同等大小的Page。将n个连续的page连接在一起组成一个Span。
PageHeap向OS申请内存,申请的span可能只有一个page,也可能有n个page。
ThreadCache内存不够用会向CentralCache申请,CentralCache内存不够用时会向PageHeap申请,PageHeap不够用就会向OS操作系统申请。
小对象内存分配 ThreadCache
TCMalloc 定义了很多个size class,每个size class都维护了一个可分配的的空闲列表,空闲列表中的每一项称为一个object(如下图),同一个size-class的空闲列表中每个object大小相同。
在申请小内存时(小于256K),TCMalloc会根据申请内存大小映射到某个size-class中。
比如,申请0到8个字节的大小时,会被映射到size-class1中,分配8个字节大小;申请9到16字节大小时,会被映射到size-class2中,分配16个字节大小….以此类推。
上面每一个object都是 N bytes。用于Thread Cache小内存分配。
这个就组成了每一个ThreadCache的free list,thread可以从各自的free list获取对象,不需要加锁,所以速度很快。
如果ThreadCache的free list为空呢?那就从CentralCache中的CentralFreeList中获取若干个object到ThreadCache对应的size class列表中,然后在取出其中一个object返回。
如果CentralFreeList中的object不够用了呢?那CentralFreeList就会向PageHeap申请一连串由Span组成页面,并将申请的页面切割成一系列的object之后,再将部分object转移给ThreadCache。
如果PageHeap也不够用了呢?那就向OS操作系统申请内存。
从上面论述可以看出,这也是一个多级缓存思想的应用。
当申请的内存大于256K时,不在通过ThreadCache分配,而是通过PageHeap直接分配大内存。
大对象内存分配 PageHeap
PageHeap负责向操作系统申请内存。
tcmalloc也是基于页的分配方式,即每次申请至少一页(page)的内存大小。tcmalloc中一页大小为8KB,多数linux中一页为4KB,tcmallo的一页是linux一页大小的2倍。
PageHeap申请内存时按照页申请,但它管理分配好的page内存时的基本单位是Span,Span对象代表了连续的页。如下图所示:
PageHeap中是如何组织Span,如下图
Middle end-Central Free List
CentralFreeList的作用就是从PageHeap中取出部分Span,然后按照预定大小将其拆分成固定大小的object,提供给ThreadCache使用。
[完]
二、参考
- TCMalloc
- TCMalloc Design
- TCMalloc : Thread-Caching Malloc
- google gperftools
- 图解TCMalloc
- TCMalloc的工作原理
TCMalloc 内存分配原理简析的更多相关文章
- 深入理解golang:内存分配原理
一.Linux系统内存 在说明golang内存分配之前,先了解下Linux系统内存相关的基础知识,有助于理解golang内存分配原理. 1.1 虚拟内存技术 在早期内存管理中,如果程序太大,超过了空闲 ...
- PHP的错误报错级别设置原理简析
原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...
- Linux内存管理机制简析
Linux内存管理机制简析 本文对Linux内存管理机制做一个简单的分析,试图让你快速理解Linux一些内存管理的概念并有效的利用一些管理方法. NUMA Linux 2.6开始支持NUMA( Non ...
- JAVA JVM常见内存参数配置简析
JVM常见内存参数配置简析 常见参数 -Xms .-Xmx.-XX:newSize.-XX:MaxnewSize.-Xmn(-XX:newSize.-XX:MaxnewSize) 简析 1.-Xm ...
- 深入Java核心 Java内存分配原理精讲
深入Java核心 Java内存分配原理精讲 栈.堆.常量池虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,详细讲解Java内存分配方面的知识. Java内存分 ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
- JVM内存分配原理
堆栈常量池等内存分配原理详解 存储的方式: 寄存器 栈(stack) 堆(heap) 静态域 常量池 非RAM存储 JAVA寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. ...
随机推荐
- Node.js 从零开发 web server博客项目[koa2重构博客项目]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- 仿苏宁移动web页面 自适应 rem&less
index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- 4.CountDownLatch-闭锁
- 深入理解SVM,详解SMO算法
今天是机器学习专题第35篇文章,我们继续SVM模型的原理,今天我们来讲解的是SMO算法. 公式回顾 在之前的文章当中我们对硬间隔以及软间隔问题都进行了分析和公式推导,我们发现软间隔和硬间隔的形式非常接 ...
- Sqlmap爆库命令的简单使用
转载:https://blog.csdn.net/qq_41617034/article/details/89502428 测试地址:因为涉及商业隐私,这里就不列啦 我这里用的是windows,并没有 ...
- uniapp vue v-html,显示富文本,内容img图片超出解决办法
uniapp h5中,v-html,img图片中style=width:auto;会显示图片原来的尺寸,会超出屏幕,替换成width:100%,这样就不会超出屏幕 重要的地方,例如<img sr ...
- HYWZ 吴恩达-机器学习+神经网络反向传播
- PHP:文件包含漏洞
简单记录一些文件包含漏洞的常用方法 产生原因: 文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意 ...
- 普转提Day1
T1 给定一个长度为N的序列,去掉其中连续的一部分使得剩下的部分没有重复元素. 很显然可以发现去掉的一部分只有三种情况:开头.中间.最后. 那么我们只需要枚举Hash就可以了.复杂度O(N^2). 不 ...
- Cookies题解
来源:<算法竞赛进阶指南> Describe: 有M块饼干要分给N个孩子.当有k个孩子分到的饼干数比第i个孩子分到的多时,会产生g[i]*k的贡献.求最小的贡献及任意一种方案. Solut ...