根据 this OCaml 的内存包含在由 OCaml 运行时管理的两个连续的虚拟内存块中。我想知道为什么这是必要的。难道 OCaml 不能简单地使用系统 malloc
来分配内存,并且只使用这些堆来存储 block 头和指向对象在内存中实际位置的指针吗?当操作系统可以代替做这么多工作时,这似乎是对轮子的重新发明。
我还想知道为什么 OCaml 必须在垃圾收集的 compact
阶段分配一个全新的主堆 (source here),例如:
在下面的草图中,让字母 A
-D
代表大小相等的 OCaml block ,让 .
代表一个释放相同大小的空间。据我了解,OCaml 垃圾收集器将“压缩”这个主要堆:
[AAABB..CCCCCC.....DDD....]
通过分配一个新的主堆:
[.........................]
并在释放原始堆之前将仍然存在的 block 复制到其中:
[AAABBCCCCCCDDD...........]
这比简单地重新排列原始堆中的这些 block 有何效率?在上面的示例中,连续性检查完全可以避免移动 block A
和 B
,无论如何,询问操作系统如何更有效总是分配一个全新的主堆?
最佳答案
出于性能原因,每个垃圾收集器都处理自己的堆。 malloc
非常慢,与 OCaml 次要堆分配相比,它慢了多个数量级(次要堆中的分配在 2 条汇编指令中完成)。
对于压缩,不,不重新分配。
关于memory - 为什么 OCaml 需要创建自己的堆来进行垃圾回收?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31997182/