我正在使用动态嵌入的Scala,我认为我很聪明,可以通过Function0
在主机程序中捕获它们来节省对位的重新解释。大概是这样的:
object Code
def intp: IMain = ???
object Capture {
private val vr = new ThreadLocal[() => Any]
def apply[A](thunk: => A) {
vr.set(() => thunk)
}
def result: () => Any = vr.get()
}
def capture(code: String): Future[() => Any] = future {
blocking {
intp.setExecutionWrapper("Code.Capture")
intp.interpret(code)
Capture.result
}
}
}
这个“不知何故”有效,但在 JVM 发疯后不久,基本上挂起,产生 Perm Gen 错误等。所以我必须做一些被禁止的事情。如果我不使用捕获机制,这一切都运行顺利(但我必须一遍又一遍地重新执行该interpret
方法,而不是保留已编译的函数),所以那没有错。
我试图通过一个步进调试器来查看是否发现任何可疑之处,但没有。在某些时候,程序会完全冻结。我还通过在等待完成Promise
的主块上启动一个单独的编译线程来隔离期货案例,这并没有改变任何东西。capture
任何帮助表示赞赏。也许与类加载器等存在混淆?(我IMain
确实覆盖parentClassLoader
能够访问主机类)。
我有一个最终的直觉,也许我应该在apply
方法 ( writeObject
) 中序列化函数,然后在主机中反序列化。但是readObject
然后产生一个
java.lang.ClassNotFoundException: $line1.$read$$iw$$iw$$anonfun$1
也许暗示下面的问题?