1

我正在使用动态嵌入的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

也许暗示下面的问题?

4

0 回答 0