为什么OCaml需要为垃圾收集创建自己的堆?

时间:2015-08-13 19:50:03

标签: memory garbage-collection ocaml

根据this,OCaml的内存包含在由OCaml运行时管理的两个连续的虚拟内存块中。我想知道为什么这是必要的。 OCaml无法简单地使用系统malloc来分配内存,只使用这些堆来存储块头和指向对象在内存中的实际内容的指针?当操作系统可以完成大量工作时,这似乎是对轮子的重新发明。

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

在下面的粗略草图中,让字母A - D代表大小相等的OCaml块,让.代表相同大小的释放空间。根据我的理解,OCaml垃圾收集器会紧凑的#34;这个主要的堆:

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

通过分配新的主要堆:

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

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

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

这比简单地重新排列原始堆中的块更有效吗?在上面的示例中,连续性检查可以避免必须移动块AB,并且在任何情况下,如何要求操作系统始终< / strong>分配一个全新的主要堆?

1 个答案:

答案 0 :(得分:2)

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

对于压缩,没有那个没有重新分配。