自定义DSL的Scala Interpreter导致内存泄漏?

时间:2011-05-20 16:54:57

标签: scala memory-leaks interpreter dsl

在我目前的项目中,我们计划实施特殊的DSL,以允许最终用户进行工作流程自定义。我们正在考虑几种方法来实现它,其中一种方法是使用Scala解释器(IMain)和用Scala编写的DSL本身。做一些初步实验我发现遵循简单的程序会导致内存泄漏并导致完全堆消耗。它可以通过每次创建新的IMain对象来解决,但它是非常昂贵的操作(时间和内存)所以使用单个Interpreter肯定更好。每次调用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 个答案:

答案 0 :(得分:2)

这不是内存泄漏。您在while循环的持续时间内不断添加新的sort定义,当然,每个排序定义都会增加内存使用量。

另见class unload