根据this,OCaml的内存包含在由OCaml运行时管理的两个连续的虚拟内存块中。我想知道为什么这是必要的。 OCaml无法简单地使用系统malloc
来分配内存,只使用这些堆来存储块头和指向对象在内存中的实际内容的指针?当操作系统可以完成大量工作时,这似乎是对轮子的重新发明。
我还想知道为什么OCaml必须在垃圾收集的compact
阶段(source here)分配一个全新的主堆,例如:
在下面的粗略草图中,让字母A
- D
代表大小相等的OCaml块,让.
代表相同大小的释放空间。根据我的理解,OCaml垃圾收集器会紧凑的#34;这个主要的堆:
[AAABB..CCCCCC.....DDD....]
通过分配新的主要堆:
[.........................]
在释放原始堆之前,将仍然存在的块复制到其中:
[AAABBCCCCCCDDD...........]
这比简单地重新排列原始堆中的块更有效吗?在上面的示例中,连续性检查可以避免必须移动块A
和B
,并且在任何情况下,如何要求操作系统始终< / strong>分配一个全新的主要堆?
答案 0 :(得分:2)
出于性能原因,每个垃圾收集器都会处理自己的堆。 malloc
非常慢,与OCaml次要堆分配相比,它慢了几个数量级(次要堆中的分配在2个汇编指令中完成)。
对于压缩,没有那个没有重新分配。