5

Jikes RVM是一个metacircular java运行库,似乎有用Java编写的Allocator/Collector(MMTK)。使用托管语言编写内存管理器?

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

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

+0

真正的答案在于源代码...所以获取Jikes的源代码并在其中搜索 – 2013-04-06 05:46:20

+3

我已经做到了。这是一个巨大的项目,我没有找到任何具体的启示。这就像回答“JVM如何工作”与“去下载HotSpot存储库并开始寻找!” – 2013-04-06 05:56:12

+0

我听说过MMTK,基本上它是一个程序生成器。你也可以阅读他们的论文,并向作者询问...... – 2013-04-06 05:57:26

回答

1

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

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

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

我想说像杰克斯这样的设计的差异化是他们的效率(有时是灵活性)。用GC语言编写GC,解释器或运行库是不够的。结果必须可用,这通常意味着速度。可能还需要有条款来处理应用程序层的本地代码集成。大部分真正的工作都会进入这些东西。只要在GC语言中运行GC是一件非常简单的事情:这基本上就是在不同的抽象层次上标记和管理对象。

注意:如果您对GC语言和基于GC的运行时间进行了编码签名,则可以利用此优点提高性能和简化性能。例如,您可以使用两个完整的垃圾收集器(一个在另一个之上)运行,而在顶部使用一个较薄的GC可以在底部安装一个更智能的GC。更智能的GC知道运行时间和应用程序级别之间的差异,确保分别对它们进行操作,而不是进行不适当的混合。薄顶GC基本上只是通过主GC理解的方式对主GC或标签对象进行过程调用,但这不会增加大量开销。

事情有关这些类型的项目是每一个有点不同。目标和实现语言的性质决定了设计选择。给你足够的机会去创造你解决问题的方式。

0

你想要哪个答案:
- “这只是一个引导过程,有什么大不了的?”

- !“这是神奇的(也就是说,一个技术比目前一个领会更先进。)”

第一Ç编译器被写了,得到这个,Ç。第一操作系统是如何写的?为了一个谁花了一个下午labouriously创建纸带引导一tedious-一个接一个地使用切换开关和控制台灯(在18位DEC PDP-15上)的,这些都不是什么神秘的东西,一开始就是最先进的作品,可以重复使用,直到工具包足以构建应用程序为止

+2

我正在寻找更具体的问题。我知道如何编写自承载编译器,并且我熟悉了自举过程。但是,我不知道bootstrapping在像垃圾回收器这样有运行时依赖的情况下如何工作,这与编译器的编译时间依赖非常不同。 – 2013-04-22 16:45:57