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

时间:2013-04-06 05:45:05

标签: compiler-construction garbage-collection programming-languages runtime

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

我认为像Jikes这样的设计的差异化是它们的效率(有时是灵活性)。用GC语言编写GC,解释器或运行时是不够的。结果必须可用,这通常意味着速度。可能还需要有规定来处理应用程序层的本机代码集成。大部分真正的工作都涉及到这些东西。只使用GC语言运行GC是一个非常简单的部分:基本上只是标记和管理不同抽象级别的对象。

注意:如果您对GC语言和基于GC的运行时进行编码,则可以利用此功能来提高性能和简化性。例如,不是让两个完整的垃圾收集器运行,而是一个在另一个上面,你可以在底部安装一个更智能的GC,顶部有一个薄的GC。更智能的GC知道运行时和应用程序级别之间的差异,确保单独操作它们而不是不正确的混合。瘦顶级GC实际上只是以主GC理解的方式对主GC进行过程调用或标记对象,但这不会增加大量开销。

关于这些项目,每个项目都有点不同。目标和实现语言的性质决定了很多设计选择。为您提供大量机会,让您了解如何解决问题。

答案 1 :(得分:0)

你想要哪个答案:
  - “这只是一个自助过程,有什么大不了的?” 或
  - “这很神奇!(也就是说,这种技术比目前所理解的技术更先进。)”

编写了第一个 C 编译器,得到了这个, C 。第一个操作系统是如何编写的?对于一个花了一个下午的人来说,使用拨动开关和控制台指示灯(在18位DEC PDP-15上),使用切换开关和控制台指示灯(使用18位DEC PDP-15)来创建纸带引导一个单调乏味的这是一个谜。一个简单的开始是可以重复使用的最先进的部分,并构建复杂性增加的工具,直到工具包足以构建应用程序。