【问题标题】:How is the persistent JVMs feature implemented in cake?cake 的持久化 JVM 特性是如何实现的?
【发布时间】:2011-01-14 18:44:00
【问题描述】:

我试图了解 cake 是如何实现其多 JVM 方法的。在高层次上,我认为 cake 的工作方式类似于 nailgun,其中只有一个 JVM 实例(一个 JVM 进程),不同项目的新“JVM”实际上只是在新的类加载器中评估的 clojure/jars(以及不同的 jar 依赖项),在我看来这不是一个新的 JVM 实例。但是,What's the difference between Cake and Leiningen? 暗示存在多个 JVM(一个用于蛋糕,* 用于项目),而不仅仅是一个 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))))

【问题讨论】:

    标签: clojure jvm


    【解决方案1】:

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

    之所以需要两个 JVM,是因为 cake 的依赖项(cake JVM)与项目的依赖项(bake JVM)是​​分开的。 cake repl 等一些命令在 bake JVM 中运行,以利用项目的类路径。

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

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

    【讨论】:

    • 谢谢。好的,在旧版本中,每个项目都会创建一个新的 JVM,我的错误印象是,它更类似于 nailgun,只有一个 JVM 实例。 nailgun 方法在我看来是理想的 JVM 启动时间和忽略安全问题,我现在意识到这不是蛋糕的实现方式。我试图确定在需要重新启动或创建 JVM 的情况下有关 JVM 启动时间的好处,而不是每个 cake 命令。
    • classlojure 是否支持运行时原生依赖加载?
    【解决方案2】:

    雷恩斯是正确的。从 cake 0.6.0 开始,每个项目都有一个 JVM。 Cake 在主类加载器中运行,并使用 classlojure 将项目加载到单独的类加载器中,并在类路径更改时重新加载它。我们已经讨论了一个全局的 ~/.cake/config 选项,用于在所有项目之间共享一个 JVM。使用 classlojure 添加它应该不会太难。这种方法的主要问题是如何将蛋糕任务插件分开。也许全局 cake 项目可以在主类加载器中运行,每个项目可以得到两个类加载器(一个用于 cake,一个用于项目)。

    对于原生依赖,classlojure 不支持在 JVM 启动后添加。只要本机库路径对于特定类加载器是本地的并且不在同一 JVM 中的所有类加载器之间共享,那么添加此功能的补丁将受到欢迎。

    【讨论】:

    • 不幸的是,您提到的最后两个要求基本上无法满足(据我所知)。此外,如果使用不同的 JVM 实现运行,我上面给出的代码将会中断。
    猜你喜欢
    • 2010-12-31
    • 2015-01-05
    • 2013-11-06
    • 2023-03-19
    • 2022-01-27
    • 2013-10-19
    • 1970-01-01
    • 2011-02-19
    • 2012-01-09
    相关资源
    最近更新 更多