erlang 的垃圾回收机制 gc
1.内存的增长主要在binary上
1.binary有两处存储位置
--1. size <= 64 字节(bytes)时,存储在进程的单独heap中,bianry叫做Heap-binary。
--2. size > 64 字节(bytes)时,存储在虚拟机分配出来的单独heap中,bianry叫做Refc-binary。
2.gc(Garbage Collection) 垃圾收集器
1.Heap的gc------分代的gc
1.进程堆里的gc是分代gc,想法基于统计学:大部分的数据生存周期都比较短,最新的数据更容易不再被利用。
这里使用young heap 和 old heap来区分数据,young放新数据,old放旧数据,也就是gc后存活的数据
2. 进程堆中gc有两个过程:---浅扫描和深扫描
1.浅扫描:
当young heap空间不足时,erlang会对young heap做一次扫描,把有用的数据复制到新申请的young heap中,扫描过一次的数据
放入old heap中,删除原来的young heap .
2. 深扫描
当old heap空间不足时,eralng会对old heap做一次扫描,把有用的数据放入新申请的young heap中,删除原理的heap(即young heap和old heap)。
============================危=======================================
深扫描----可以手动执行gc ,和gc次数超过fullsweep_after的参数限定
1.fullsweep-after控制深扫描的频率
这个参数确定了多少次gc后执行一次深度gc(深扫描),默认值是65535.
2. 手动gc
gc() ->
[erlang:garbage_collect(P) || P <- erlang:processes(),
{status, waiting} == erlang:process_info(P, status)],
erlang:garbage_collect(),
ok.
2.Refc的gc------引用计数的gc
每当有进程使用这个binary时,在自己进程heap中创建这个binary的引用以外,还要把记录这个binary
的引用次数+1,只有当这个binary的引用次数为0时,才会把这个binary从专门的heap中释放。