尝试为小型XText项目生成语言基础结构时出现OutOfMemoryError

时间:2012-07-19 06:51:58

标签: eclipse xtext

我创建了一个新的XText项目,其中包含一个定义语法的xtext文件,并且不会更改项目中的任何其他文件。我定义的语法花了大约150行,当试图“生成语言基础设施”时,一切进展顺利,但后来我扩展了一点,现在基础设施生成失败了:

460476 [main] ERROR mf.mwe2.launch.runtime.Mwe2Launcher  - Java heap space
java.lang.OutOfMemoryError: Java heap space
    at java.util.ArrayList.iterator(Unknown Source)
    at org.eclipse.xtext.util.formallang.PdaUtil$TraversalItem.<init>(PdaUtil.java:247)
    at org.eclipse.xtext.util.formallang.PdaUtil.newItem(PdaUtil.java:531)
    at org.eclipse.xtext.util.formallang.PdaUtil.filterEdges(PdaUtil.java:451)
    at org.eclipse.xtext.serializer.analysis.ContextTypePDAProvider.createPDA(ContextTypePDAProvider.java:178)
    at org.eclipse.xtext.serializer.analysis.ContextTypePDAProvider.getContextTypePDA(ContextTypePDAProvider.java:188)
    at org.eclipse.xtext.serializer.analysis.SyntacticSequencerPDAProvider.getPDA(SyntacticSequencerPDAProvider.java:604)
    at org.eclipse.xtext.generator.serializer.SyntacticSequencerUtil.getAllPDAs(SyntacticSequencerUtil.java:59)
    at org.eclipse.xtext.generator.serializer.SyntacticSequencerUtil.getAllAmbiguousTransitions(SyntacticSequencerUtil.java:79)
    at org.eclipse.xtext.generator.serializer.SyntacticSequencerUtil.getAllAmbiguousTransitionsBySyntax(SyntacticSequencerUtil.java:90)
    at org.eclipse.xtext.generator.serializer.AbstractSyntacticSequencer.getFileContents(AbstractSyntacticSequencer.java:95)
    at org.eclipse.xtext.generator.serializer.SerializerFragment.generate(SerializerFragment.java:97)
    at org.eclipse.xtext.generator.Xtend2GeneratorFragment.generate(Xtend2GeneratorFragment.java:66)
    at org.eclipse.xtext.generator.Xtend2GeneratorFragment.generate(Xtend2GeneratorFragment.java:59)
    at org.eclipse.xtext.generator.CompositeGeneratorFragment.generate(CompositeGeneratorFragment.java:92)
    at org.eclipse.xtext.generator.LanguageConfig.generate(LanguageConfig.java:113)
    at org.eclipse.xtext.generator.Generator.generate(Generator.java:361)
    at org.eclipse.xtext.generator.Generator.invokeInternal(Generator.java:128)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:126)
    at org.eclipse.emf.mwe.core.lib.Mwe2Bridge.invoke(Mwe2Bridge.java:34)
    at org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent.invoke(AbstractWorkflowComponent.java:201)
    at org.eclipse.emf.mwe2.runtime.workflow.AbstractCompositeWorkflowComponent.invoke(AbstractCompositeWorkflowComponent.java:35)
    at org.eclipse.emf.mwe2.runtime.workflow.Workflow.run(Workflow.java:19)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:102)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:62)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Runner.run(Mwe2Runner.java:52)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.run(Mwe2Launcher.java:74)
    at org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher.main(Mwe2Launcher.java:35)

我在Eclipse配置中检查了该操作的启动设置,并查看到那时为-Xmx512m。我试图增加这个数字,它所做的一切就是现在这个动作需要花费更多的时间才能崩溃同样的错误。我一直到-Xmx3000m - 我不想在我的4Gb机器上尝试更多。

我想强调的是,我所做的就是创建一个新的XText项目并修改默认的“Hello X!”语法由我自己的200行语法定义。我的语法编译得很好,没有任何警告或错误。 导致此内存错误的原因是什么,以及如何解决?

我发现this related blog post但我承认提议的修复程序超出了我的水平,我不确定我需要做什么以及它是否能解决问题。

1 个答案:

答案 0 :(得分:0)

我终于能够缩小这个问题:

Datatype:
  Rule1 '=' Rule2 Rule3 INT Rule4 etc etc...

内存不足;而

Datatype:
  name=Rule1 '=' Rule2 Rule3 INT Rule4 etc etc...

即使使用原始-Xmx512m也能正常工作。唯一的区别是为其中一条规则指定 name 。我没有意识到命名规则是如此重要,我认为如果我只关心语法正确的DSL文件并且不打算进一步处理它们,我可以在很大程度上跳过它,但我想我错了......