memory-management - Erlang 中的垃圾收集和内存管理

标签 memory-management garbage-collection erlang

我想了解有关 Erlang/OTP 中垃圾收集 (GC) 和内存管理的技术细节。

但是,我在 erlang.org 上找不到及其文件。

我在网上找到了一些文章,很笼统地讲了GC,比如使用了什么垃圾回收算法。

最佳答案

为了分类,我们先定义内存布局,然后讨论 GC 的工作原理。

内存布局

在 Erlang 中,每个执行线程称为一个进程。每个进程都有自己的内存,内存布局由三部分组成:进程控制 block 堆栈

enter image description here

  • 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/

相关文章:

linux - Malloc 在 64 位 Ubuntu 机器上失败

python - 如何应用最大缓存大小来内存?

.NET:确定对象是否对它有任何引用的方法?

erlang - Erlang/Elixir 是如何进行消息恢复的

erlang - 为什么 spawn_link 在 Erlang 中是必需的?

erlang - 使用Rebar3 Common Test在include文件夹中找不到hrl文件,但eunit却找到

c++ - 为什么 malloc() 或 new 从不返回 NULL?

c++ - 在删除指向动态分配对象的指针 vector 中的元素之前,我需要做什么?

perl - 在 XS 代码中祝福空引用时泄漏

c# - 枚举比手动检查不同的变化更便宜时,是否在比较期间将 1,000 多个字符串转换为小写?