`
jzhihui
  • 浏览: 268101 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Erlang并发机制 – 垃圾回收

阅读更多

 

Erlang中每个进程都有独立的堆内存,默认的大小是233words(可配置),并以Fibonacci序列的顺序增长(233对应fib(11))。不过,当堆内存增大到一定程序时,增长速度减缓,比如内存大于fib(35)=14M的时候,堆内存开始不以Fibonacci序列增长(具体参见[$R15B_OTP_SRC/erts/emulator/beam/erl_gc.c --> erts_init_gc]里的说明)。一般情况下,进程所用到的数据都放在各自的堆内存中。

 

         ErlangGC机制跟其它语言(比如Java)相比,很重要的一点是,它的GC是以进程为单位进行的(一般情况下,GC搜索的根对象主要包括进程栈以及进程信箱中的对象)。Erlang系统中,GC进行时,会挂起整个系统(当前结点上的所以调度队列),也就是说它的GC也是“stop the world”。但是,就算一个系统中有大量进程,总共占用几个G的内存,它的GC的延迟也会很低,这是因为每个进程可能只使用很小的内存(比如20K),在这么小的内存上进行GC所花费的时间很小,基本可以忽略不计。

Erlang中可以通过spawn_opt来指定初始堆内存大小,如果这个数值足够大(需要诊断后确定),那么就可以完全避免GC。进程在销毁时,统一收回其所拥有的所有堆内存,而不需要进行GC,因为堆内存是每个进程私有的。

 

         Erlang中,堆内存被分成年轻代和年老代。进程在分配新数据时,会将数据放在年轻代中(分代的理论基础是大部分刚创建的对象会在不久的将来不再使用)。只查看年轻代对象的GC称为minor GC,查看所有堆内存对象的GC称为major GC,因此minor GCmajor GC更频繁,也更快。年轻代中的对象经过两到三次minor GC后,才会被拷贝到年老代。

 

Minor GC

         年青代堆内存中存在一个标记位:高水位线(high water mark),比这个标记位地址小的对象称为较老的年轻代(older young generation),大于这个地址的称为较年轻的年轻代(younger young generation)。

         Minor GC时,会分配一块新的堆内存,用于存放在可以在本次GC后可以生存下来的较年轻的年轻代。年轻代内存中被进程的根对象所引用的对象,如果它的地址小于高水位线,则会被拷贝到年老代堆内存,否则将其拷贝到新分配的堆内存中。然后根据新分配堆内存以及较老的年轻代堆内存中对象的引用,将所有活着的对象按原来的位置关系拷贝到新分配的堆内存或者年老代中。

         Minor GC进行时,年老代堆内存不会被扫描,以加快GC速度。Minor GC完成后,会根据GC过程中是否有较老的年轻代对象来决定高水位线的位置:如果存在,高水位线设置成

新的年轻代堆内存的开始地址;如果不存在,则会设置成年轻代堆内存的堆顶地址。

 

 

Major GC

         Major GC时,年轻代堆内存和年老代堆内存中被根对象间接或直接引用到的对象都会被拷贝到新的堆内存中,高水位线会被设置成新的堆内存的堆顶地址。新的堆内存成为当前进程的年轻代堆,原来的老的堆内存(年轻代以及年老代)都会被释放。

 

(图片及关于Minor GCMajor GC的部分说明来源于Characterizing the Scalability of Erlang VM on Many-core Processors

  • 大小: 91.8 KB
  • 大小: 86.6 KB
分享到:
评论
1 楼 thomescai 2012-05-24  
最近也在学Erlang,支持下楼主

相关推荐

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    erlang并发编程 .pdf

    Erlang是一门专为并发计算设计的编程语言,提供了高效的轻量级进程模型以支持高并发应用。它由Joe Armstrong、Robert Virding、Claes Wikström和Mike Williams等人撰写,并由CPiE-CN团队翻译成中文版。 在《Erlang...

    erlang并发编程实战源代码

    erlang并发编程实战源代码erlang并发编程实战源代码

    erlang并发编程

    6. 分布式特性:Erlang的并发机制不仅限于单个节点,它也支持跨节点的并发。通过分布式Erlang,可以在多个物理机器上运行的节点间透明地进行进程通信,这对于构建可扩展的分布式系统非常有用。 7. OTP(Open ...

    erlang并发编程中文翻译(cpie-cn).zip

    3. 进程间同步:Erlang提供了多种同步机制,如监控(monitoring)、链接(linking)和信号(signals)。链接允许进程之间的生命周期关联,当一个进程崩溃时,链接到它的进程会接收到异常信息。监控则是一种单向的...

    Erlang并发编程 part1

    erlang并发编程,erlang之父Joe Armstrong得原著之一。

    Erlang OTP并发编程实战(中文版)

    **Erlang OTP并发编程实战** 是一本专为开发者深入理解Erlang OTP并发机制而设计的实战指南。OTP(Open Telecom Platform)是Erlang编程语言的核心组件,提供了强大的并发处理能力和分布式系统构建框架。这本书以...

    ERLANGOTP并发编程实战清晰中文版

    erlang otp学习文档 学习还不错的

    Erlang脚本在并发编程中的应用及其代码实现

    Erlang是一种专为并发和分布式系统设计的编程语言,它以轻量级进程、消息传递和强大的模式匹配机制而闻名。Erlang脚本在并发编程中的应用广泛,从简单的多进程通信到复杂的分布式系统构建,Erlang都能提供高效的解决...

    erlang编程 Introducing Erlang

    Erlang的一大亮点是其内置的并发机制。它使用轻量级进程(Lightweight Processes, LWP)来实现并发,每个进程有自己的消息队列,通过消息传递进行通信。这种模型降低了同步的复杂性,提高了系统的可扩展性和容错性。...

    Erlang OTP并发编程实战 附书源码

    Erlang OTP并发编程实战是深入理解Erlang并发特性和 OTP(Open Telephony Platform)设计原则的关键资源。这本书的附书源码包含了14个章节的实例代码,旨在帮助读者通过实践掌握Erlang在分布式系统、容错以及高并发...

    ErlangOTP并发编程实战

    《erlang/otp并发编程实战》侧重生产环境下的erlang 开发,主要讲解如何构建稳定、版本控制良好、可维护的产品级代码,凝聚了三位erlang 大师多年的实战经验。 《erlang/otp并发编程实战》主要分为三大部分:第一...

    erlang资源

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入...

    ErlangOTP并发编程实战(高清PDF版)

    书是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。本书将帮助读者在消息传递的基础上构建分布式的并发系统...

    erlang的timer和实现机制

    Erlang是一种面向并发的、动态类型的编程语言,尤其适合构建高可用性和容错性的分布式系统。在Erlang中,`timer`模块是用于处理延时操作和定时任务的关键工具,它提供了丰富的功能,使得开发者能够优雅地处理时间...

    erlang 深度分析

    - **垃圾回收**: VM具有自动垃圾回收机制,但开发者可以通过调整来优化垃圾回收行为。 - **内部实现**: - **内存管理**: VM采用了一种称为“代”的内存管理策略,新创建的对象放在年轻代,经过多次生存后会被移动...

Global site tag (gtag.js) - Google Analytics