码迷,mamicode.com
首页 > 其他好文 > 详细

erlang 的垃圾回收机制 gc

时间:2020-05-14 10:48:28      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:after   最新   空间   执行   size   超过   垃圾收集   基于   自己   

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

标签:after   最新   空间   执行   size   超过   垃圾收集   基于   自己   

原文地址:https://www.cnblogs.com/ye-jing/p/12886787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!