erlang GC

二进制存储

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内,如果超过了64 bytes,就被保存到进程外的共享堆里,可以给节点内所有进程共享。

erlang有两种二进制容器:heap binaries和refc binaries。

heap binaries
这个就是进程堆二进制,是一些比较小的二进制数据,每个数据大小不超过64bytes,这些数据保存在进程堆内。对于这里的二进制数据,垃圾回收走的是进程堆数据的回收机制,参考这里。如果发给其他进程的消息含有这些数据,erlang将直接复制一份到别的进程堆内。

refc binaries
官方的叫法是引用计数二进制,就是对于那些超过64bytes的二进制数据,他们如果直接保存在进程堆内,将导致进程频繁的gc,比较大的数据复制来复制去开销也很大。所以,erlang将这些数据保存在进程外的共享堆,再把这个二进制数据的地址给拥有这个数据的进程。所以,进程堆内保存的是这个二进制数据的引用,叫ProcBin。如果进程把这个二进制数据发给其他进程,erlang也不再复制整个二进制数据,而是直接再生成一份ProcBin到别的进程堆内。那么,这个二进制数据就可以多个进程的ProcBin引用,当没有一个ProcBin引用到这个二进制数据,这个二进制就被erlang回收。

所以,这种二进制数据的gc的是引用计数的回收机制。注意了,ProcBin是进程堆内数据,走的是进程堆数据的回收方式。

进程间存储 使用分代

原文地址:https://www.cnblogs.com/unqiang/p/14103664.html