【问题标题】:OutOfMemoryError when trying to generate a language infrastructure for a tiny XText project尝试为小型 XText 项目生成语言基础结构时出现 OutOfMemoryError
【发布时间】:2012-07-19 18:23:13
【问题描述】:

我创建了一个新的 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,但我承认建议的修复超出了我的水平,我不确定我需要做什么以及它是否能解决问题。

【问题讨论】:

  • 您使用哪个 Xtext 版本?您可以提交附有语法的罚单吗?您在语法中看到任何警告吗?
  • @SebastianZarnekow Xtext 2.3.0 版,作为完整的 Eclipse 4.2 发行版从 eclipse.org/Xtext/download.html 下载。语法中没有警告或错误。如果您认为这是一些更广泛的 Xtext 问题,那么我想我可以尝试提交一张票……尽管我似乎需要一个帐户:\
  • 我曾经有过类似的事情。我的 DSL 链接到所有扩展名为“*.script”的文件。在我的工作区中,我有一个属于数据库的文件“db.script”,它非常大(大约 10MB),但与我的 DSL 无关。删除文件后,一切又顺利了。也许这里有类似的东西?
  • @moeTi 我很困惑,听起来你在描述打开 DSL 文件时的问题,而我的问题是在构建语言基础架构时。无论如何,我的语法文件不引用除common.Terminals之外的任何其他文件。
  • @Oak 对不起,我看错了你的问题。忘记我说的话;-)

标签: eclipse xtext


【解决方案1】:

我终于能够缩小问题的范围:

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

内存不足失败;而

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

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

【讨论】:

  • 感谢您缩小范围。我用该信息提交了一张票:bugs.eclipse.org/bugs/show_bug.cgi?id=385496 您能否也提供有关其他规则的信息?那将非常有帮助。理想情况下,它应该是一个完整的语法,可以用作复现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多