Утечка памяти scala.tools.nsc.interpreter

Мне нужно реализовать DSL (Domain Specific Language) с использованием Scala, и этот 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)

Не могли бы кто-нибудь помочь мне решить эту проблему?

6
задан Jonas 29 September 2011 в 12:32
поделиться