Scala Interpreter для пользовательских DSL приводит к утечкам памяти? - PullRequest
2 голосов
/ 20 мая 2011

В моем текущем проекте мы планируем внедрить специальный 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
    }
}

1 Ответ

2 голосов
/ 20 мая 2011

Это не утечка памяти.Вы постоянно добавляете новые sort определения для продолжительности цикла while, и, естественно, каждое определение сортировки будет увеличивать использование памяти.

См. Также class unload .

...