erlang 的垃圾回收机制 gc

Posted ye-jing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中释放。

以上是关于erlang 的垃圾回收机制 gc的主要内容,如果未能解决你的问题,请参考以下文章

译深入了解Erlang 垃圾回收机制以及其重要性

深入了解Erlang 垃圾回收机制以及其重要性

jvm基础--GC垃圾回收机制

深入理解GC垃圾回收机制

Java垃圾回收机制是啥?

PHP垃圾回收机制(GC)