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中释放。