作者:http://blog.csdn.net/mycwq
每个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一开始分配的内存比较小。如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会收缩堆,回收内存。
erlang进程堆的gc是分代gc,分代gc的想法基于统计学:大部分数据的生存周期都比较短,最新的数据更容易不再被使用。这里erlang使用young heap 和old heap来区分数据,young heap放新数据,old heap放旧数据,也就是gc后存活的数据。
erlang进程堆gc有两个主要过程:浅扫描和深扫描
浅扫描(minor collection)
浅扫描是当young heap空间不足时,erlang会对young heap做一次扫描,把有用的数据复制到新申请的young heap空间,发现已经扫描过1次以上的数据放入old heap,然后删掉原来的young heap
在young heap中,erlang使用了高水位线来区分标记一次以上的数据和未标记的数据,那么young heap移入old heap的就是超过高水位线的数据