В моем текущем проекте мы планируем внедрить специальный DSL, чтобы позволить конечному пользователю выполнять настройки рабочего процесса. Мы рассматриваем несколько способов сделать это, и одним из них является использование Scala Interpreter (IMain) и DSL, написанных на самой Scala. Выполняя некоторые первоначальные эксперименты, я обнаружил, что следующая простая программа имеет утечки памяти и приводит к полному потреблению кучи. Эту проблему можно решить, каждый раз создавая новый объект IMain, но это очень дорогая операция (время и память), поэтому определенно лучше использовать один интерпретатор. Метод interpreter.reset вызывается каждый раз, но это не помогает.
Если у вас есть опыт работы с Scala Interpreter, не могли бы вы рассказать, как правильно его использовать и избежать утечек памяти?
Мы используем Scala 2.9.
import scala.tools.nsc.interpreter._
import scala.tools.nsc.Settings
import java.util.concurrent.TimeUnit
object DslTest {
val settings = new Settings()
settings.usejavacp.value = true
var interpreter = new IMain(settings);
def main(args : Array[String]) {
val t = System.currentTimeMillis
do {
test()
} while (System.currentTimeMillis - t < TimeUnit.SECONDS.toMillis(3000))
}
def test() {
interpreter.interpret("""
def sort(a:Array[Int]): Array[Int] =
if (a.length < 2) a
else {
val pivot = a(a.length / 2)
sort (a filter (pivot>)) ++
(a filter (pivot == )) ++
sort (a filter(pivot <))
}""");
interpreter.reset
}
}