Erlang进程堆垃圾回收机制
作者:http://blog.csdn.net/mycwq
每一个Erlang进程创建之后都会有自己的PCB,栈,私有堆。erlang不知道他创建的进程会用到哪种场合下,所以一開始分配的内存比較小。假设分配的空间不够了,erlang gc会动态调整堆大小以满足需求,假设分配的空间大了,就会收缩堆,回收内存。
erlang进程堆的gc是分代gc。分代gc的想法基于统计学:大部分数据的生存周期都比較短,最新的数据更easy不再被使用。
这里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的就是超过高水位线的数据
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbXljd3E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
深扫描(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
Erlang进程堆垃圾回收机制的更多相关文章
- erlang二进制数据垃圾回收机制
erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两 ...
- Erlang垃圾回收机制的二三事
声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...
- 深入了解Erlang 垃圾回收机制以及其重要性(转)
声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转 ...
- 巩固java(二)----JVM堆内存结构及垃圾回收机制
前言: 我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构 ...
- .net垃圾回收机制编程调试试验
1. 什么是CLR GC? 它是一个基于引用跟踪和代的垃圾回收器. 从本质上,它为系统中所有活跃对象都实现了一种引用跟踪模式,如果一个对象没有任何引用指向它,那么这个对象就被认为是垃圾对象,并且可以被 ...
- JVM的生命周期、体系结构、内存管理和垃圾回收机制
一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- java JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
- asp.net 之 GC (垃圾回收机制)
今天抽时间好好整理了下GC相关知识,看了CSDN和博客园的几篇文章,有了一定的简单了解,决定根据个人理解整合一份随笔写下来,望诸位指教. 一:基础问题 1.首先需要知道了解什么是GC? GC如其名,就 ...
随机推荐
- Python3的基本数据类型及常用的方法
python3的基本数据类型: 在python3当中有这么几种基本的数据类型:int(整形).str(字符串).list(列表).tuple(元组).dict(字典).bool(布尔值)等.数字整体划 ...
- sublime__最全面的 Sublime Text 使用指南
感谢大佬--> 原文链接 摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的Sublime Text中文教程. 前言(Prologue) Sublime T ...
- Linux下Tomcat的安装和部署
一.安装tomcat 1.下载tomcat安装包apache-tomcat-7.0.62.tar.gz和jdk1.7 2.安装tomcat,将apache-tomcat-7.0.62.tar.gz复制 ...
- 关于面试总结-SQL经典面试题
关于面试总结6-SQL经典面试题 前言 用一条SQL 语句查询xuesheng表每门课都大于80 分的学生姓名,这个是面试考sql的一个非常经典的面试题 having和not in 查询 xueshe ...
- EIGRP
因为rip的收敛时间长 尤其是使用过程中 链路down掉 重收敛的时间比较长 所以在中到大型的园区网中很少用到rip协议 只有在很小的局域网中用到rip 因为收敛时间可能会稍微短一些 ...
- [uiautomator篇] 获取当前页面的方法
Uiautomator 在2.0之前的版本里就提供了getCurrentActivity()的方法,但返回内容不正确:2.0 版本今天尝试了下,还是返回有问题的: 有点没描述清楚啊,是在uiautom ...
- DefaultActionInvocation 源码
/** * Copyright 2002-2006,2009 The Apache Software Foundation. * * Licensed under the Apache License ...
- HDu-1247 Hat’s Words,字典树裸模板!
Hat's Words 题意:给出一张单词表求有多少个单词是由单词表里的两个单词组成,可以重复!按字典序输出这些单词. 思路:先建一个字典树,然后枚举每个单词,把每个单词任意拆分两部分然后查找. 目测 ...
- 西南民大oj 1762 我的式子不可能那么难写 【波兰式】
描述 啦啦啦.作为一个苦逼的程序猿.?.请看下图... 现在老总想让你帮他儿子写个简单计算器(他儿子小学3年级,嘘!),写不出来就扣奖金..快帮他写吧... 给一个包含+-*/()的正确的表达式.要你 ...
- 小机房的树(codevs 2370)
题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子, ...