scala.tools.nsc.interpreter утечка памяти - PullRequest
6 голосов
/ 28 сентября 2011

Мне нужно реализовать 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)

Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

2 голосов
/ 29 сентября 2011

Каждый раз, когда вы вызываете метод interpret, запрос сохраняется. Поэтому, если вы попытаетесь вызвать этот метод бесконечное число раз, вы должны столкнуться с проблемой. Так что это не совсем ошибка.

Вы можете увеличить количество возможных итераций перед сбоем, увеличив максимальный размер кучи JVM ... Вы можете подсчитать количество возможных вызовов, чтобы проверить, соответствует ли это вашей цели.

...