5

Jikes RVM 是一个元循环 Java 运行时,它的分配器/收集器似乎是用 Java (MMTK) 编写的。

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

但显然 MMTK 有效,显然其他一些项目也在使用它。如何用 Java 这样的托管语言编写内存分配器和 GC?

4

2 回答 2

1

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

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

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

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

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

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

于 2013-04-17T22:20:13.487 回答
0

Which answer do you want:
- "It's just a bootstrap process, what's the big deal?"
or
- "It's magic! (That is to say, a technology more advanced than one currently comprehends.)"

The first C compilers were written in, get this, C. How was the first operating system written? To one who has spent an afternoon labouriously creating a paper-tape bootstrap one-tedious-bit-after-another using toggle switches and console lights (on an 18-bit DEC PDP-15), none of this is a mystery anymore. One simply starts with the most advanced pieces that can be re-used, and build tools of increasing complexity until the tool kit is adequate to build the application.

于 2013-04-22T04:41:35.197 回答