Scala工具包中的nsc解释器存在内存泄漏问题。

6
我需要用Scala实现DSL(领域特定语言),并且这个DSL将在Scala解释器(scala.tools.nsc.interpreter)中进行解释。问题是解释器使用的内存会不断增加,直到抛出OutOfMemory异常。每次执行DSL行时我不能重新初始化解释器,因为解释器需要一段时间才能加载。我也不能仅仅调用reset(),因为我需要跟踪解释器执行环境中的某些数据。
即使我按照以下步骤操作,内存泄漏仍然会发生:
while (true)
{
 interpreter.interpret("println(4 + 5)")
}

过一段时间后,我将得到:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at ch.epfl.lamp.util.ByteArray.<init>(ByteArray.java:24)
    at ch.epfl.lamp.fjbg.JCode.<init>(JCode.java:47)
    at ch.epfl.lamp.fjbg.JExtendedCode.<init>(JExtendedCode.java:113)
    at ch.epfl.lamp.fjbg.FJBGContext.JCode(FJBGContext.java:122)
    at ch.epfl.lamp.fjbg.JMethod.<init>(JMethod.java:52)
    at ch.epfl.lamp.fjbg.FJBGContext.JMethod(FJBGContext.java:87)
    at ch.epfl.lamp.fjbg.JClass.addNewMethod(JClass.java:246)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genMethod(GenJVM.scala:755)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$genClass$7.apply(GenJVM.scala:307)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$genClass$7.apply(GenJVM.scala:307)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:45)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genClass(GenJVM.scala:307)
    at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$run$4.apply(GenJVM.scala:86)
    at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$run$4.apply(GenJVM.scala:86)
    at scala.collection.mutable.HashMap$$anon$2$$anonfun$foreach$3.apply(HashMap.scala:102)
    at scala.collection.mutable.HashMap$$anon$2$$anonfun$foreach$3.apply(HashMap.scala:102)
    at scala.collection.Iterator$class.foreach(Iterator.scala:660)
    at scala.collection.mutable.HashTable$$anon$1.foreach(HashTable.scala:157)
    at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:190)
    at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:43)
    at scala.collection.mutable.HashMap$$anon$2.foreach(HashMap.scala:102)
    at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase.run(GenJVM.scala:86)
    at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(IMain.scala:756)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(IMain.scala:731)
    at scala.tools.nsc.interpreter.IMain$Request.compile(IMain.scala:873)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:576)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
    at com.ericsson.ims_dsl.IMS_Interpreter$$anonfun$e$1.apply(IMS_Interpreter.scala:50)
    at com.ericsson.ims_dsl.IMS_Interpreter$$anonfun$e$1.apply(IMS_Interpreter.scala:50)
    at scala.tools.nsc.interpreter.IMain.beQuietDuring(IMain.scala:200)

有人能帮我解决这个问题吗?


请翻译以下与编程有关的内容,从英语到中文。仅返回翻译后的文本:请说明您正在使用哪些版本和平台。 - Jus12
Scala版本2.9.1;Java版本1.6;Windows Vista 32位 - Peter
1个回答

2
每次调用interpret方法时,请求都会被存储。因此,如果您尝试无限次调用此方法,您可能会遇到问题。所以这不是真正的错误。
您可以通过增加JVM最大堆大小来增加崩溃前的可能迭代次数...您可能希望计算可调用次数以检查是否达到目标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接