在erlang中,每个process都有一个独立的heap(初始大小233个words),process用到的数据都保存在其自身的heap 中。这个heap可以动态的进行扩张与收缩。当heap中的数据达到heap大小的75%的时候,heap的大小会自动增大(依据fibonacci数进行增长,而不是类似某些语言实现中依据倍数增长),当heap中的数据小于heap大小的25%的时候,heap会自动进行缩小(上面涉及到的数据25%,75%可能不是很准确,这无关紧要)。
在erlang中拥有成千上万的process,其garbage collection是针对每个process来实现,每个process独立的运转。与此对应是一个全局的gc的实现,这样很有可能出现gc工作时挂起多个process的情况,这样会极大的影响并发效率。同时,erlang中每个process具有独立的gc机制,在process销毁时,process占用的内存可以轻易的销毁,大大提高process创建,销毁的效率,使process轻量,这在并发环境中也很重要。每个 process具有单独的heap和gc机制,所以process之间不能共享数据,这样可能会产生一定的数据冗余。
对于比较大的binary,在erlang中是保存在另一个专有的heap中,而不是在某个process的heap中。binary基于引用计数实现。
对于process,你可以通过一些方法去减少garbage collection,首先你要了解process大概的heap消耗,(比如通过一些性能分析应用,查看process占用的内存,那么你可以在创建process的时候指定heap的大小),随后调用是spawn_opt/4来创建process,比如spawn_opt(M, F, [], [link, {min_heap_size, 1000}]). 创建一个process,其最小heap为1000个word。注意这里的min_heap_size,需要依据程序设置,建议在程序调优时才使用。
想了解更多erlang的gc实现,参考HIPE项目相关文档
个人理解,不同之处请多指正。
在erlang中拥有成千上万的process,其garbage collection是针对每个process来实现,每个process独立的运转。与此对应是一个全局的gc的实现,这样很有可能出现gc工作时挂起多个process的情况,这样会极大的影响并发效率。同时,erlang中每个process具有独立的gc机制,在process销毁时,process占用的内存可以轻易的销毁,大大提高process创建,销毁的效率,使process轻量,这在并发环境中也很重要。每个 process具有单独的heap和gc机制,所以process之间不能共享数据,这样可能会产生一定的数据冗余。
对于比较大的binary,在erlang中是保存在另一个专有的heap中,而不是在某个process的heap中。binary基于引用计数实现。
对于process,你可以通过一些方法去减少garbage collection,首先你要了解process大概的heap消耗,(比如通过一些性能分析应用,查看process占用的内存,那么你可以在创建process的时候指定heap的大小),随后调用是spawn_opt/4来创建process,比如spawn_opt(M, F, [], [link, {min_heap_size, 1000}]). 创建一个process,其最小heap为1000个word。注意这里的min_heap_size,需要依据程序设置,建议在程序调优时才使用。
想了解更多erlang的gc实现,参考HIPE项目相关文档
个人理解,不同之处请多指正。