我想了解有关 Erlang/OTP 中垃圾收集 (GC) 和内存管理的技术细节。
但是,我在 erlang.org 上找不到及其文件。
我在网上找到了一些文章,很笼统地讲了GC,比如使用了什么垃圾回收算法。
最佳答案
为了分类,我们先定义内存布局,然后讨论 GC 的工作原理。
内存布局
在 Erlang 中,每个执行线程称为一个进程。每个进程都有自己的内存,内存布局由三部分组成:进程控制 block 、堆栈和堆。
PCB:进程控制 block 保存进程标识符 (PID)、当前状态(运行、等待)、其注册名称和其他此类信息等信息。
<堆栈:它是一个向下增长的内存区域,保存传入和传出参数、返回地址、局部变量和用于计算表达式的临时空间。
堆:它是一个向上增长的内存区域,用于保存进程邮箱消息和复合术语。大于 64 字节的二进制项不存储在进程私有(private)堆中。它们存储在一个可供所有进程访问的大型共享堆中。
垃圾收集
目前,Erlang 使用在每个 Erlang 进程私有(private)堆中独立运行的分代垃圾回收,并且针对全局共享堆进行引用计数垃圾回收。
私有(private)堆GC:它是分代的,因此将堆分为两部分:年轻代和老年代。还有两种收集策略; Generational(次要)和Fullsweep(主要)。分代GC只收集年轻堆,而fullsweep会收集年轻堆和老堆。
共享堆GC:它是引用计数。共享堆 (Refc) 中的每个对象都有一个由其他对象 (ProcBin) 持有的引用计数器,这些对象存储在 Erlang 进程的私有(private)堆内。如果对象的引用计数器达到零,则该对象将变得不可访问并将被销毁。
要获取更多详细信息和性能提示,请查看我的文章,该文章是答案的来源:Erlang Garbage Collection Details and Why It Matters
关于memory-management - Erlang 中的垃圾收集和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221907/