2019独角兽企业重金招聘Python工程师标准>>>

作者:http://blog.csdn.net/mycwq

每个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一开始分配的内存比较小。如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会收缩堆,回收内存。

erlang进程堆的gc是分代gc,分代gc的想法基于统计学:大部分数据的生存周期都比较短,最新的数据更容易不再被使用。这里erlang使 用young heap 和old heap来区分数据,young heap放新数据,old heap放旧数据,也就是gc后存活的数据。

erlang进程堆gc有两个主要过程:浅扫描和深扫描

浅扫描(minor collection)

浅扫描是当young heap空间不足时,erlang会对young heap做一次扫描,把有用的数据复制到新申请的young heap空间,发现已经扫描过1次以上的数据放入old heap,然后删掉原来的young heap

在young heap中,erlang使用了高水位线来区分标记一次以上的数据和未标记的数据,那么young heap移入old heap的就是超过高水位线的数据

深扫描(major collection)

深扫描是一般当old heap空间不足时触发,erlang会对young heap和old heap做扫描,把有用的数据放入新申请的young heap,删掉原来的heap

深扫描的触发条件还有手动执行gc,和gc次数超过fullsweep_after的参数限定

控制垃圾回收

以游戏网关进程为例,网关进程通常有大量消息,而大部分消息都只是在网关这里做转发,生命周期很短,所以网关进程可以设定较大的初始内存,较快的内存回收。

spawn_opt(Fun, [{min_heap_size, 5000},{min_bin_vheap_size, 100000},{fullsweep_after, 500}])

先看下参数默认值:
1> erlang:system_info(min_heap_size).
{min_heap_size,233}
2> erlang:system_info(min_bin_vheap_size).
{min_bin_vheap_size,46368}
3> erlang:system_info(fullsweep_after).
{fullsweep_after,65535}

min_heap_size是进程最小堆大小

这个参数两个地方会用到,第一处是erlang初始化进程堆大小,第二处是gc后堆收缩后维持的最小值,min_bin_vheap_size是进 程最小虚拟二进制堆大小,这两个参数都是以word为单位。初始化足够大的初始内存,可以减少轻度gc的次数,减少反复申请和回收内存的开销

fullsweep_after控制深扫描的频率

这个参数确定多少次gc后执行一次深度gc,默认值为65536,有点大了

所以,上面3个参数配合起来的意义就是,进程初始化分配足够大的内存,减少反复申请内存的开销,当申请的内存不够用,gc会重新申请内存,累计达到500次就做一次gc

手动执行垃圾回收

上面提到了利用fullsweep_after来控制gc的情况,下面再介绍手动gc的情况:
在rabbitMQ看到这段代码,可以在项目中定期执行这个函数:
gc() ->
    [erlang:garbage_collect(P) || P <- erlang:processes(),
                           {status, waiting} == erlang:process_info(P, status)],
    erlang:garbage_collect(),
    ok.
当然,你还可以加入一些判断,比如指定占内存过50M的进程执行gc

erlang进程占用多少内存

用下面这个方法检查erlang进程占用的内存,你可以换别的参数再试试
Fun = fun()-> receive after infinity -> ok end end.
erlang:process_info(erlang:spawn(Fun), memory).

erlang垃圾回收的副作用

前面讲到erlang进程堆的gc是分代gc的,这个只是全局层面的,在底层erlang还是走了标记清除的路子。标记清除这种gc方式是定期执行 的,首先gc不够及时,其次,在gc执行期间开销比较大,会引起中断。不过每个erlang进程的堆区域是独立的,gc可以独立进行,加上它内存区域比较 小,还有erlang的变量是单次赋值,无需多次追踪,因此,erlang进程gc的延迟不会引起全局的中断

erlang文档 参考
GC in Erlang works independently on each Erlang process, i.e. each Erlang process has its own heap, and that heap is GCed independently of other processes' heaps.
The current default GC is a "stop the world" generational mark-sweep collector. On Erlang systems running with multiple threads (the default on systems with more than one core), GC stops work on the Erlang process being GCed, but other Erlang processes on other OS threads within the same VM continue to run. The time the process spends stopped is normally short because the size of one process' heap is normally relatively small; much smaller than the combined size of all processes heaps.

结束语

这里讲了erlang进程堆的gc,另外erlang还有其他gc机制,比如,二进制共享堆和进程外堆碎片是引用计数gc,这里先不做讨论,有时间我会在下篇做讨论,有兴趣可以看这里了解一下。

参考:

http://blog.csdn.net/mycwq/article/details/26613275

http://www.cnblogs.com/me-sa/archive/2011/11/13/erlang0014.html

转载于:https://my.oschina.net/u/658658/blog/420124

Erlang进程堆垃圾回收机制相关推荐

  1. Erlang 垃圾回收机制(GC)

    为了创建高高响应的软实时系统,需要快速的垃圾回收机制,启动GC时不会造成系统响应时间的延迟;erlang作为Immutable(不可变)语言,有较高的垃圾生成率,也需要高效的垃圾回收机制. Memor ...

  2. Android进程优先级和垃圾回收机制

    进程优先级低到高: 空进程 后台进进程 服务进程 可见进程 前台进程 垃圾回收机制: 引用计数法(未采用),无法处理循环引用问题.egA引用B,B引用C,C引用A. 标注并清理回收法(mark and ...

  3. [Erlang 0014]Erlang垃圾回收机制

    前面的Erlang杂记中我们简单提到过Erlang的垃圾回收机制:1.以进程为单位进行垃圾回收 2.ETS和原子不参与垃圾回收.今天我们继续这一话题,关注更多关于细节. 在Erlang的官方文档中,关 ...

  4. python释放变量内存_Python尚学堂高淇|1113引用的本质栈内存,堆内存,内存的示意图,标识符,变量的声明初始化,垃圾回收机制...

    011-引用的本质-栈内存和堆内存-内存的示意图在Python当中,变量也成为:对象的引用,因为,变量的存储就是对象的地址变量通过地址引用了对象变量位于堆内存(压栈,出栈等细节,后续再介绍)对象位于: ...

  5. jvm垃圾回收机制_JVM 垃圾回收机制之堆的分代回收

    JVM垃圾回收机制之堆的分代回收 前言 前文我们了解了Java的GC机制,对于堆中的对象,JVM采用引用计数和可达性分析两种算法来标记对象是否可以清除,本文中我们还会了解到JVM将对分成了不同的区域, ...

  6. java 堆_JAVA学习笔记 07——堆、栈和垃圾回收机制

    程序执行的内存分析过程: 虚拟机栈(简称:栈)的特点如下: 1. 栈描述的是方法执行的内存模型.每个方法被调用都会创建一个栈帧(存储局部变量.操作数.方法出口等). 2. JVM为每个线程创建一个栈, ...

  7. java gc回收堆还是栈_浅析JAVA的垃圾回收机制(GC)

    1.什么是垃圾回收? 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制. 注意:垃圾回 ...

  8. 周志朋java_java中堆和垃圾回收机制的介绍

    java中堆和垃圾回收机制的介绍 发布时间:2020-07-03 14:55:53 来源:亿速云 阅读:113 作者:元一 这篇文章将为大家详细讲解有关java中堆和垃圾回收机制的介绍,文章内容质量较 ...

  9. java垃圾回收机制_笔记 | Java垃圾回收机制

    本文经授权转载自程序员杂货铺(ID:speakFramework) 垃圾回收 最近上海的小伙伴是不是要被强垃圾分类搞疯了???哈哈哈哈 上海是个走在前列的城市啊,不光骑自行车闯红灯要被罚钱,垃圾不分类 ...

  10. JVM的垃圾回收机制详解和调优

    1.JVM的gc概述 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都使用类似的 ...

最新文章

  1. python 使用sax 解析xml 文件
  2. Newtonsoft.Json.dll 本地调用正常,服务器调用不正常
  3. 游戏开发基础:判断碰撞(转摘)
  4. Mac git clone速度太慢
  5. 分享我的学习记录 svn地址
  6. OpenCV油画效果
  7. Unity3D_(游戏)卡牌03_选关界面
  8. 网站改版进行时,需要注意的
  9. Django中_meta 部分用法
  10. 常用验证码功能实现大全
  11. 图像处理中的深度学习技术
  12. Spark学习资料汇总
  13. 数独游戏代码C++解法
  14. conda SSL错误
  15. 联通光纤猫虚拟服务器设置,【2017年整理】联通光猫配置操作手册.doc
  16. python刷阅读_Python 刷高博客阅读量
  17. No executable file specified.Use the “file“ or “exec-file“ command.
  18. 关于Redis的远程连接 Connection: Disconnect on error 问题
  19. 【论文精读】Pairwise learning for medical image segmentation
  20. Java窗体图书管理系统Java图书借阅管理系统(图书借阅系统)

热门文章

  1. 基于核极限学习机(KELM)分类 -附代码
  2. 遥感数字图像处理 初体验
  3. 【GIS】GIS概念
  4. android schedule 参数,android – requestLocationUpdates minTime参数的用途
  5. 一个程序员的爱情和他的小棉袄
  6. xml文件的根节点layout_width或者layout_height设置无效果的原因分析
  7. 腾讯视频 Python 爬虫项目实战
  8. Cannot run program /usr/local/android-sdk-linux/build-tools/23.0.2/aapt: error=2, No such file or
  9. 10年腾讯技术专家有话对你说
  10. pythotn基础篇——条件分支与循环--3