是否可以预加载 JVM 以使小型一次性 Java 应用程序的启动速度更快?

是否可以预加载 JVM 以使小型一次性 Java 应用程序的启动速度更快?

预期算法:

  1. 您启动 JVM 时无需实际应用程序(仅告诉它加载一些 jar),它会加载并监听套接字并在后台等待。
  2. 当您启动应用程序(preloaded_java -cp /usr/share/java/....jar:. qqq.jar)时,它会连接到已加载的 JVM、加载其他 jar(如果有)并执行主类。
  3. preloaded_java仅路由输入和输出并处理中断等。

更新实施了概念证明:http://vi-server.org/vi/code/prejvm/

$ clojure prejvm.clj&
[1] 2883
$ nc 127.0.0.1 7711 <<< '{"mainclass" "test.Hello"}'
$ nc 127.0.0.1 7712
java.lang.ClassNotFoundException: test.Hello
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    ...
    at clojure.main.main(main.java:37)

$ nc 127.0.0.1 7711 <<< '{"classpaths" ["file:///home/vi/code/prejvm/"], "mainclass" "test.Hello"}'    
$ nc 127.0.0.1 7712
Hello, world; number of args is 0
qwe q e32e qda
qwe q e32e qda

$ nc 127.0.0.1 7711 <<< '{"classpaths" ["file:///home/vi/code/prejvm/"], "mainclass" "test.Hello", "argv" ["qqq" "www" "eee"]}'
$ nc 127.0.0.1 7712    
Hello, world; number of args is 3
sdfasdfasf df sad
sdfasdfasf df sad

更新 2:自己找到了答案:Nailgun 服务器(来自 VimClojure)。

答案1

使用Nailgun服务器:

启动它:

java -classpath /usr/share/java/clojure.jar:/usr/share/java/clojure-contrib.jar com.martiansoftware.nailgun.NGServer 127.0.0.1

用它:

$ ng clojure.main 
Clojure 1.2.0
user=>

$ ng test.Hello sdf sdf sdf
Hello, world; number of args is 3
sdfsdf
sdfsdf

可以使用 VimClojure 获取:http://www.vim.org/scripts/script.php?script_id=2501

答案2

不,您所描述的是不可能的,至少对于 Sun JVM 来说是不可能的,仅仅是因为它没有实现(尽管这是一个不错的想法)。

但是,如果您只运行一次该应用,操作系统会将从磁盘加载的数据缓存在 RAM 中,因此后续启动应该会快得多。这可能已经有所帮助了。

如果您需要更高的加速:您是否可以更改应用程序,使其保持运行并接受新的输入?

答案3

当然可以。您所描述的实际上非常接近 Java EE 应用服务器的工作原理。

相关内容