用托管语言编写内存管理器?

Li *_*oyi 5 compiler-construction garbage-collection programming-languages runtime

Jikes RVM是一个metacircular java运行时,似乎有用Java(MMTK)编写的Allocator/Collector.

当垃圾收集器需要垃圾收集器运行时,它是如何工作的?通过查看代码,我没有看到MMTK将自己限制为Java的任何特定子集,但在我看来,如果您的代码用于分配托管内存需要分配托管内存来运行,那么它将进入递归旋转直到它爆炸.

但显然MMTK可以工作,显然其他一些项目也在使用它.如何在Java等托管语言中编写内存分配器和GC?

Nic*_*k P 1

这样的事例已经不少了。我不熟悉 Jikes 的实现,但我确实阅读了基于 Java 的设计和 PyPy 的内容。它们大多数的共同点是将事物分为两个级别:运行时/解释器级别和应用程序级别。每个级别都有自己的对象、异常、执行流程等。

当你抽象地思考时,其实更容易理解。运行时层可能已被编写为内存管理或非内存管理、低级或高级、命令式或函数式。这并不重要。重要的是它的功能,它的作用。它最终被翻译成机器代码,并且所有机器代码对于机器来说都是相同的。该代码将操作码和数据作为输入,基于此执行预定义的操作,管理资源等。

应用层包含在这些操作码中。应用层代表另一个整体功能,它接收输入、处理输入并执行输出。这些步骤还可能内置有内存管理例程。运行时并不关心操作码正在做什么,只要它们有效并且它只是执行它们。理论上,您可以编写一种 GC 语言,其中包含一种 GC 语言,而另一种 GC 语言又包含一种 GC 语言……依此类推,直到达到 ENIAC 速度。;)

我想说像 Jikes 这样的设计的区别在于它们的效率(有时是灵活性)。仅用 GC 语言编写 GC、解释器或运行时是不够的。结果必须可用,这通常意味着速度。可能还需要在应用程序层处理本机代码集成的规定。大部分实际工作都涉及这些内容。仅用 GC 语言运行 GC 是真正简单的部分:这基本上只是在不同抽象级别标记和管理对象。

注意:如果您共同设计 GC 语言和基于 GC 的运行时,您可以利用这一点来提高性能和简单性。例如,您可以在底部运行一个更智能的 GC,在顶部运行一个精简 GC,而不是运行两个完整的垃圾收集器(一个在另一个之上)。更智能的 GC 知道运行时级别和应用程序级别之间的差异,确保分别对它们进行操作,而不是进行不当的混合。精简顶部 GC 本质上只是以主 GC 理解的方式对主 GC 进行过程调用或标记对象,但这不会增加大量开销。

这类项目的特点是每个项目都有点不同。目标和实现语言的性质在很大程度上决定了设计选择。为您提供大量发挥创意解决问题的机会。