Действительно ли возможно предварительно загрузить JVM для создания запуска небольших одноразовых JAVA-приложений быстрее?

Ожидаемый алгоритм:

  1. Вы запускаете JVM без реального приложения (только говорящий это загрузить некоторые банки), это загружается и слушает сокет и ожидает в фоне.
  2. Когда Вы запускаете приложение (preloaded_java -cp /usr/share/java/....jar:. qqq.jar) это соединяется с существующей загруженной JVM, загружает дополнительные банки (если таковые имеются) и выполняет основной класс.
  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).

7
задан 24.11.2013, 02:13

3 ответа

Использование сервер 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

3
ответ дан 07.12.2019, 15:13

Нет, что Вы описываете, не возможно, по крайней мере, не с JVM Sun, просто потому что она не реализовала (хотя это - хорошая идея).

Однако, если Вы просто запустите приложение однажды, то ОС будет кэшировать данные в RAM, которая была загружена из диска, таким образом, последующие запуски должны быть намного быстрее. Это могло бы уже помочь.

Если Вам нужно более высокое ускорение: можно ли, возможно, изменить приложение, такое, что оно просто продолжает управлять и принимает новый вход?

0
ответ дан 07.12.2019, 15:13

Уверенный это может быть сделано. То, что Вы описываете, на самом деле достаточно близко к тому, как работает сервер JAVA EE-приложения.

0
ответ дан 07.12.2019, 15:13

Теги

Похожие вопросы