【问题标题】:Scripting-language for JVM with fast initialization具有快速初始化的 JVM 脚本语言
【发布时间】:2020-08-11 04:20:22
【问题描述】:

我有一个简单的 java 应用程序,它获取 jmx 连接 url、对象名称和属性名称作为输入和输出属性值。此应用程序每分钟运行数百次,并具有严格的运行时间限制。最近出现了许多极端情况(将毫秒转换为秒、折叠列表等),重新编译和重新分发此应用程序变得乏味。 所以我决定切换到一些支持 JMX 的脚本语言。

我尝试过 groovy、jython 和 clojure,发现它们的初始化时间很长(groovy/clojure/jython 大约为 0.9/1.2/3.5)。

有没有更快的初始化速度,或者有没有办法减少这些语言的初始化时间而不从java加载它们?

【问题讨论】:

  • 所以您在一个每秒启动数百次的应用程序中受到启动时间的限制?取消重复初始化并使其成为守护进程怎么样?
  • 一分钟一百次,而不是一秒钟。此应用程序由守护程序启动,无法克服这一点,应用程序必须每次都由该守护程序启动。我虽然想做一个由守护进程启动并连接到另一个守护进程的代理,但维护另一个守护进程比维护 java 更难。

标签: optimization scripting jvm-languages


【解决方案1】:

现在,jark 似乎是一个不错的解决方案。

像这样写一个clojure脚本

(ns jarkserver)

(require '[clojure.tools.nrepl :as nrepl])

(defn -main
[& args]
(nrepl/start-server 9000)
(.join (Thread/currentThread)))

开始:

 lein run -m jarkserver

然后使用以下命令启动 REPL:

 jark repl

或使用以下命令运行您的 clojure 脚本:

 jark <path_to_clojure_script>

或者只是内联执行一些 clojure 代码:

 jark -e "(+ 1 1)"

编辑: 启动 Jark 服务器的更简单方法是:

jark -cp lib/*:lib/dev/*:* -p 9000 server start  

【讨论】:

  • 这似乎是个好主意,对于 groovy 或 jython 有没有类似的东西?
  • 我已经为使 jark(网站上最新的 0.4.3)工作而苦苦挣扎了一段时间。通过“-e”进行评估效果很好,但我无法运行脚本。尝试 ./jark test.clj 时,我得到“jark:没有这样的模块 test.clj”。
  • @Blin 我遇到了同样的问题,我的错误是我在不同的目录中启动了 jark 服务器,通过使用脚本的完整路径调用 jark 一切正常。 (仅供参考,您可以使用 jark -e (. System getProperty \"user.dir\") 检查 jark 的当前工作目录)。
【解决方案2】:

我找到了一个适用于所有 Java 脚本语言的解决方案,它是 nailgun。 它与其他答案中建议的 jerk 和 cake 具有相同的原理,但它运行任意 java 类。

This 博客文章对如何使用 nailgun 运行 jython 脚本进行了很好的说明,我相信它可以应用于其他脚本语言。

【讨论】:

【解决方案3】:

显然,Clojure 的 Cake (https://github.com/flatland/cake) 包含一个 Clojure 脚本启动器,它使用在后台运行的已经初始化的 JVM。您必须自己查找详细信息,因为我从未使用过它,也不知道有关它的任何具体信息。但显然它大大缩短了启动时间。

【讨论】:

    【解决方案4】:

    其他选项(我不熟悉):

    其他值得探索的途径(降低前景):

    【讨论】:

      猜你喜欢
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2016-08-19
      • 1970-01-01
      • 2023-03-08
      • 2010-09-24
      • 2022-01-10
      相关资源
      最近更新 更多