Erlang内存模型笔记
erlang的内存模型是分层级的。
如下图所示,有两个主分配器sys_alloc和mseg_alloc。其中sys_alloc是使用malloc方式手动分配(熟悉C语言的话,肯定指定这个方法吧),而mseg_alloc是使用mmap方式向系统分配一整块分页的内存。另外还有1-9的子分配器。
图片来自于erlang in anger
默认情况下,CPU每个核上的调度器都有一份分配器的实例,就是说每个调度器都有各自的1-9的子分配器实例。这些子分配器都是从sys_alloc或mseg_alloc处请求内存,有两种请求方式,要么是mbcs, 要么是sbcs。mbcs就是多块载体,多个小数据会使用这种方式,而如果需要分配一块很大的数据,使用的就是sbcs了。
为了后文便于说明,下面展示几个已经分配了空间的内存块。
下面是erlang的不同内存分配策略:
1. bf 最佳|匹配
6. gf 良好匹配
7. af 基本匹配
1-9的子分配器可以独立配置上述不同的分配策略.
接下来详细说明上述分配策略。
bf: (按可用块优先)VM基于所有的可用块大小构建一颗平衡二叉树,然后尽量寻找能够容纳数据项最小的那个,也就是平衡二叉树尽量靠左。
下面附上以上图为例的可能分配情况,便于理解上述概念: