Мне нужно реализовать DSL (предметно-ориентированный язык) с использованием 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)
Может кто-нибудь помочь мне решить эту проблему?