如何在蛋糕中实现持久性JVM功能?

bmi*_*are 5 jvm clojure

我试图了解cake如何实现其多种JVM方法.在高层次上,我认为蛋糕的工作方式类似于nailgun,其中有一个JVM实例(一个JVM进程),不同项目的新"JVM"实际上只是在一个新的类加载器中评估的clojure/jar(同时不同的jar依赖项),在我看来不是一个新的JVM实例.从Cake和Leiningen有什么区别?但是,有一个暗示有多个JVM(一个用于cake,*用于项目),而不仅仅是一个JVM实例.

如果创建了新的JVM实例,那么加速是从哪里来的?根据我的理解,我认为启动一个新的JVM意味着创建一个新的JVM进程,它会像往常一样产生相同的启动开销.

如果没有,如何添加本机依赖项?据我所知,JVM只知道运行时之前传递的命令行参数的本机依赖关系.我知道如何规避这一点的唯一方法是使用下面列出的Sun/Oracle JVM实现特定的hack.

 (let [clazz java.lang.ClassLoader
      field (.getDeclaredField clazz "sys_paths")] 
   (.setAccessible field true)
   (.set field clazz nil)
   (System/setProperty "java.library.path" (apply str (interpose ";" native-paths))))
Run Code Online (Sandbox Code Playgroud)

Ray*_*yne 4

Cake 有一个 Ruby 脚本来启动和管理 JVM。Ruby 没有 JVM 开销,因此 Ruby 脚本可以创建 JVM,然后当您执行命令时,Ruby 脚本会将这些命令委托给 JVM。

需要两个 JVM 的原因是,将 cake 的依赖项(cake JVM)与项目的依赖项(bake JVM)分开。一些命令(例如cake repl在烘焙 JVM 中运行)可以利用项目的类路径。

然而,在最新版本中,每个项目只有一个 JVM。这可以在同一个 JVM 中使用不同的类加载器。使用的相关库是classlojure

即使有两个 JVM 版本,JVM 也是持久的,这意味着它们仅生成一次,然后仅在绝对必要时重新启动,例如在更改类路径的情况下(当您添加新的依赖项或类似的东西时)。我不确定为什么您会认为这意味着每次执行命令时都会产生 JVM 开销。这个想法是许多命令立即发生,而不是每个命令都启动 JVM。