原文:Erlang进程堆垃圾回收机制
作者: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
分享到:
相关推荐
它负责解释Erlang字节码,提供内存管理、垃圾回收和并发调度等功能。 ### 10. 语言特性 Erlang的语法简洁,支持模式匹配、函数式编程、列表处理和递归等特性。它的动态类型系统和强大的类型推断让代码更加灵活。 ...
5. **垃圾回收机制**:ErLang的垃圾回收机制有效地管理内存,避免了常见的内存泄露问题。 6. **简洁的语法**:ErLang的函数式编程风格使得代码简洁明了,易于理解和调试。 **在Windows上安装和使用ErLang** 下载...
- **垃圾回收**: VM具有自动垃圾回收机制,但开发者可以通过调整来优化垃圾回收行为。 - **内部实现**: - **内存管理**: VM采用了一种称为“代”的内存管理策略,新创建的对象放在年轻代,经过多次生存后会被移动...
Erlang的内存管理是非常高效的,它使用了一种特殊的垃圾回收机制来确保低延迟。了解ERTS内存使用情况对于优化Erlang程序至关重要。 #### 8. 高可用性和故障恢复 Erlang的heart进程是系统监视器,它负责监测和恢复...
- 自动内存管理:Erlang使用垃圾回收机制,开发者无需手动管理内存。 - 函数式编程:Erlang强调纯函数,无副作用,代码更易于理解和测试。 RabbitMQ的核心功能包括: - 消息路由:RabbitMQ可以将消息路由到不同的...
Erlang社区和工具的发展为性能分析提供了坚实的基础,其中包括内存使用情况的监控、垃圾回收性能的评估以及实时性能数据的收集。 ##### 2.2 编码最佳实践 Erlang代码的编写有着特定的最佳实践,比如避免共享状态、...
4. **垃圾回收**:Erlang的垃圾回收机制在21.0版本可能有进一步的优化,确保内存管理更加高效,减少系统停顿时间。 5. **RabbitMQ集成**:标签中提到的"rabbit"可能指的是Erlang中的RabbitMQ,这是一个用Erlang编写...
它以其强大的错误恢复能力、轻量级进程(称为"轻量进程"或"erlang进程")以及对分布式计算的支持而闻名。Erlang的设计目标是创建一种能够在大规模并行系统中高效运行、容错性好且易于维护的语言。 **并发编程** ...
- **自动垃圾回收**:ERTS具备自动内存管理功能,减轻了开发者负担,提高了开发效率。 - **透明分布支持**:Erlang程序可以在不同机器之间无缝通信,如同在同一台计算机上一样。 - **轻量级进程支持**:每个进程占用...
BEAM虚拟机执行Erlang字节码,提供了垃圾回收、内存管理等功能。在源码中,你可以找到关于字节码解释器、垃圾收集算法的实现。 3. **模块和函数** Erlang代码通常组织成模块(modules),每个模块包含若干函数...
7. **BEAM虚拟机**:Erlang运行在BEAM(Erlang虚拟机)上,BEAM为Erlang提供了高效的内存管理和垃圾回收。 8. **标准库**:OTP包含了大量的库和组件,如Mnesia(分布式数据库)、Riak(分布式键值存储)等,为...
5. **BEAM虚拟机**:Erlang运行在BEAM虚拟机上,BEAM提供了高效的内存管理、垃圾回收和并发调度。 6. **OTP(Open Telecom Platform)**:OTP是Erlang的标准库,提供了一系列的设计原则、库和工具,用于构建可靠、...
BEAM是Erlang的虚拟机,它执行Erlang字节码,并负责管理进程、内存和垃圾回收。BEAM的设计考虑了并发和实时性,确保了Erlang程序的高效运行。 10. **Erlang生态系统** Erlang有丰富的开源库和工具,如 Cowboy...
Erlang是一种通用、并发、强类型、垃圾回收的编程语言,特别适用于构建高可用性系统。它最初由爱立信公司开发,用于电信系统的开发,因此非常适合处理大量并发连接和高负载的情况。 #### 重要知识点详述 **1.1 ...
由于Erlang运行在BEAM虚拟机上,该虚拟机优化了并发执行和垃圾回收,使得系统在处理高负载时仍能保持稳定。此外,Erlang的"let it crash"哲学鼓励程序在遇到错误时崩溃,然后由监督树自动重启,这样可以快速恢复服务...
《erlang深度分析》则可能更倾向于进阶内容,对Erlang的虚拟机(BEAM)和运行时系统进行深入剖析,包括内存管理、垃圾回收策略、热代码替换等方面。读者可能能够从中了解到如何优化Erlang程序性能,以及Erlang在大...
通过解压并编译otp_src_R16B03,开发者可以学习Erlang的实现细节,探索其并发模型和垃圾回收机制,也可以针对特定需求进行定制或扩展。同时,对于想要参与Erlang社区贡献的开发者来说,这是一个很好的起点,可以了解...
2. **内存管理**:Erlang的垃圾回收机制与C++或Java不同,`erl_protobuffs`充分利用了这一特性,优化了内存管理和对象生命周期,减少了不必要的内存开销。 3. **集成性**:由于Erlang主要用于构建分布式系统,`erl_...
Erlang的VM(虚拟机)BEAM提供了高效的内存管理和垃圾回收,对于处理大量并发请求的游戏服务器而言,这是关键的性能保障。分析和优化Erlang源码可以帮助我们理解如何最大化利用这些特性,以提高服务端性能。 8. **...