让我们聊聊Erlang的垃圾回收

原Blog地址,http://www.linkedin.com/pulse/garbage-collection-erlang-tianpo-gao?trk=prof-post。

本文将简单的描述Erlang的垃圾回收,并不是深入的探讨。

在Erlang运行时环境中,Erlang进程采用复制分代回收的方式。分代垃圾回收将内存对象划分为不同的代。在Erlang运行时环境中,有两个代,年轻代和老年代。在Erlang的运行时环境中,内存回收主要有两种,一种叫做部分垃圾回收,另一种叫做全量垃圾回收。

在Erlang运行时环境中,每当进程的堆没有足够的空间去存储新的对象的时候,将会触发对该进程的垃圾回收。由于一个Erlang进程的堆栈上的数据不和其它Erlang进程共享,当Erlang进程终止执行的时候,并不会进行垃圾回收,而是直接交还给Erlang运行时环境。当发生垃圾回收的时候,进行垃圾回收的Erlang进程会被暂停,但是支持SMP的Erlang执行环境,会继续执行其它的Erlang进程,而不是整体暂停。在进行垃圾回收的时候,部分垃圾回收会先执行。全量垃圾回收会在执行一定次数的部分垃圾回收后执行,或者当部分垃圾回收无法释放出足够的空间时,全量垃圾回收也会被执行。

在执行部分垃圾垃圾回收时,垃圾回收器只对年轻代进行垃圾回收,并且将老年代移动到老年代专用堆中。当一个Erlang的Term经历了2到3个部分垃圾回收,那么这个Term将被提升到老年代。当进行全量回收的时候,垃圾回收器会对年轻代和老年代进行垃圾回收。

那么我们是如何将内存对象划分成不同的代的?在Erlang运行时环境中,Erlang进程的控制块PCB中有一个叫做high_water的字段。当一个存储在Erlang进程堆上的Term的地址比high_water存储的值要大,那么这个Term就是年轻代,反之就是老年代。

在Erlang运行时环境中,内存回收时暂停且复制的分代回收器。每次进行垃圾回收,都会创建出一个新的堆,当垃圾回收完成之后,Erlang进程原有的堆会被释放,并且新的堆将会成为当前Erlang进程的堆,当然原有堆中存活的数据将会被移动到新的堆中。

时间: 2024-10-10 01:26:52

让我们聊聊Erlang的垃圾回收的相关文章

erlang二进制数据垃圾回收机制

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两种二进制容器:heap binaries和refc binaries. heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They

Erlang进程堆垃圾回收机制

引言 在之前的文章中,我们介绍了如何使用Scala IDE也就是eclipse中集成的Scala开发插件来进行Scala语言程序的开发,在使用了一段时间之后,发现eclipse对Scala的支持并不是很好.用户体验比较差,比如联想速度比较慢等.由于在公司一直使用的Scala开发工具是Intellij IDEA(好吧,其实我使用Scala IDE的目的就是想试一下这两个各有什么优缺点),各方面感觉还不错,所以在此介绍一下这个开发环境. Intellij IDEA是jetbrain开发的一个IDE,

Erlang垃圾回收机制的二三事

声明:本片文章是由Hackernews上的[Erlang Garbage Collection Details and Why ItMatters][1]编译而来,本着学习和研究的态度,进行的编译,转载请注明出处. Erlang需要解决的重要问题之一就是为实现极高响应能力的软实时系统创建平台.这样的系统需要一个快速的垃圾回收机制,而这个机制不会阻止系统及时的响应.另一方面,当我们把Erlang看作一种用无损更新属性的不可改变语言时,这个垃圾回收机制就显得更加重要了,因为这种语言有很高的几率产生垃

GC(Garbage Collection)垃圾回收机制

1.在垃圾回收器中,程序员没有执行权,只有通知它的权利. 2.程序员可以通过System.gc().通知GC运行,但是Java规范并不能保证立刻运行. 3.finalize()方法,是java提供给程序员用来释放对象或资源的办法,但是尽量少用. 一.GC的介绍 GC的全称是Garbage Collection (垃圾收集) 在GC中,垃圾所指的是程序在运行过程中,会产生出一些无用的对象,或者说是已经被弃用的对象,而这些对象会占用着一部分的内存空间,如果长时间不去回收这些内存空间,那么最终会导致O

go语言怎样避免垃圾回收,详见28条

Rob Pike谈Google Go:并发,Type System,内存管理和GC 1. Rob,你创建了Google Go这门语言.什么是Google Go?能简明扼要的介绍一下Google Go吗? 我还是讲讲为什么要创建这门语言吧,和你的问题稍有些不同.我在Google做了一个有关编程语言的系列讲座,在Youtube上有,谈及了我早期所写的一个语言,叫做Newsqueak,那是八十年代的事,非常早.在做讲座期间,我开始思考为什么Newsqueak中的一些想法在我现在以C++为主的工作环境中

让我们聊聊Erlang的Trap机制

在分析erlang:send的bif时候发现了一个BIF_TRAP这一系列宏.参考了Erlang自身的一些描述,这些宏是为了实现一种叫做Trap的机制.Trap机制中将Erlang的代码直接引入了Erts中,可以让C函数直接"使用"这些Erlang的函数. 先让我们思考下为什么Erlang为什么要实现Trap机制?让我先拿最近比较火的Go来说下,Go本身是编译型的和Erlang这种OPCode解释型的性质是不同的.Go的Runtime中很多函数本身也是用C语言实现的,为了胶和Go代码和

Android内存优化1 了解java GC 垃圾回收机制3

引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存优化中使用到的相关工具, 也有很多专有名词. 对Java内存管理, GC, Android内存管理, Dalvik/ART等知识有一个理论的认识, 可以让我们更好的使用这些工具, 分析内存问题. 据此, 我们就先从理论入手, 聊聊GC那些事儿. 1, 何为GC GC 是 garbage collection 的缩写, 垃圾回收的意思. 也可以是 Garbage Collector,

要想学好Java编程,构造器、方法重载、this关键字、垃圾回收机制,这4关一定要过!

有人说,你应该关注时事.财经,甚至流行的电影.电视剧,才有可能趁着热点写出爆文:有人说,你别再写"无聊"的技术文了,因为程序员的圈子真的很小,即便是像鸿洋那样的招牌大牛,文章是那么的干货,浏览量有多少?不到万吧:有人说,你别妄想在写作上面知识变现了,因为你写的文章真的很不优秀,我都不爱看! 我想说,你们说的话我都不爱听!我也懒得反驳,因为我没有成功,也就没有话语权,多说无益.我只想做一名执拗的程序员,静静地写文,哪怕只有一个读者--有时候,做一件事,并不是想要结果,仅仅只是因为心底那种

V8垃圾回收?看这篇就够了!

什么是内存管理 内存管理是控制和协调应用程序访问电脑内存的过程.这个过程是复杂的,对于我们来说,可以说相当于一个黑匣子. 当咱们的应用程序运行在某个操作系统中的时候,它访问电脑内存(RAM)来达成下列几个功能: 运行需要执行的字节码(代码) 存储程序运行时候所需的数据 加载程序运行所需的运行时环境 上面用来存储程序运行时所需的数据,就是下面要说的堆(heap)和栈(stack). 栈(stack) 顾名思义,是一种先进后出的结构,参考一下餐盘的取和放. 俄罗斯套娃,我这不禁 栈的特点 由于先进后