vlambda博客
学习文章列表

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基于所有的可用块大小构建一颗平衡二叉树,然后尽量寻找能够容纳数据项最小的那个,也就是平衡二叉树尽量靠左。


下面附上以上图为例的可能分配情况,便于理解上述概念: