作者:http://blog.csdn.net/mycwq
Gc 分浅扫描 和深度扫描 ,
spawn_opt(Fun, [{min_heap_size, 5000},{min_bin_vheap_size, 100000},{fullsweep_after, 500}])
fullsweep_after控制深扫描的频率
这个参数确定多少次gc后执行一次深度gc,默认值为65536,有点大了
heap分 yong heap 和 old heap,当 Oldheap 不足 就申请内存。
min_heap_size是进程最小堆大小
这个参数两个地方会用到,第一处是erlang初始化进程堆大小,第二处是gc后堆收缩后维持的最小值,min_bin_vheap_size是进程最小虚拟二进制堆大小,这两个参数都是以word为单位。
进程 初始化适当大的初始内存,可以减少轻度gc的次数,减少反复申请和回收内存的开销
手动Gc
gc() ->
[erlang:garbage_collect(P) || P <- erlang:processes(),
{status, waiting} == erlang:process_info(P, status)],
erlang:garbage_collect(),
ok.
erlang垃圾回收的副作用
前面讲到erlang进程堆的gc是分代gc的,这个只是全局层面的,在底层erlang还是走了标记清除的路子。标记清除这种gc方式是定期执行的,首先gc不够及时,其次,在gc执行期间开销比较大,会引起中断。不过每个erlang进程的堆区域是独立的,gc可以独立进行,加上它内存区域比较小,还有erlang的变量是单次赋值,无需多次追踪,因此,erlang进程gc的延迟不会引起全局的中断