memory - 为什么 OCaml 需要创建自己的堆来进行垃圾回收?

标签 memory garbage-collection ocaml

根据 this OCaml 的内存包含在由 OCaml 运行时管理的两个连续的虚拟内存块中。我想知道为什么这是必要的。难道 OCaml 不能简单地使用系统 malloc 来分配内存,并且只使用这些堆来存储 block 头和指向对象在内存中实际位置的指针吗?当操作系统可以代替做这么多工作时,这似乎是对轮子的重新发明。

我还想知道为什么 OCaml 必须在垃圾收集的 compact 阶段分配一个全新的主堆 (source here),例如:

在下面的草图中,让字母 A-D 代表大小相等的 OCaml block ,让 . 代表一个释放相同大小的空间。据我了解,OCaml 垃圾收集器将“压缩”这个主要堆:

[AAABB..CCCCCC.....DDD....]

通过分配一个新的主堆:

[.........................]

并在释放原始堆之前将仍然存在的 block 复制到其中:

[AAABBCCCCCCDDD...........]

这比简单地重新排列原始堆中的这些 block 有何效率?在上面的示例中,连续性检查完全可以避免移动 block AB,无论如何,询问操作系统如何更有效总是分配一个全新的主堆?

最佳答案

出于性能原因,每个垃圾收集器都处理自己的堆。 malloc 非常慢,与 OCaml 次要堆分配相比,它慢了多个数量级(次要堆中的分配在 2 条汇编指令中完成)。

对于压缩,不,不重新分配。

关于memory - 为什么 OCaml 需要创建自己的堆来进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997182/

相关文章:

java - 在 java 中创建一个稀疏的 BufferedImage

java - 使用 Java 和 XML 创建具有属性的对象(解码)

java - 循环分配/链接的 GWT 垃圾收集

c# - 对象实例化异常。初始化成员会发生什么?

module - 模块签名中的类实例类型强制

c - 堆栈上的动态内存分配

c# - 您在哪个现实生活场景中使用了垃圾收集器?

algorithm - OCaml 中的循环算法

ocaml - 默认参数值的奇怪行为

jquery - 如何手动卸载 jQuery 库?