在我目前的项目中,我们计划实施特殊的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
}
}