Можно ли предварительно загрузить JVM, чтобы ускорить запуск небольших одноразовых java-приложений?

ожидается, что алгоритм:

  1. вы запускаете JVM без фактического применения (только сказать ему, чтобы загрузить некоторые банки), он загружает и слушает сокет и ждет в фоновом режиме.
  2. при запуске приложения (preloaded_java -cp /usr/share/java/....jar:. qqq.jar) подключается к существующей загруженной JVM, загружает дополнительные jar (если есть) и выполняет основной класс.
  3. preloaded_java как раз направляет входной сигнал и выход и регулирует прерывания etc.

обновление реализовано доказательство концепция: 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.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).

21
задан gronostaj
11.02.2023 2:56 Количество просмотров материала 2867
Распечатать страницу

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
отвечен Vi. 2023-02-12 10:44

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

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

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

0
отвечен sleske 2023-02-12 13:01

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

0
отвечен jlliagre 2023-02-12 15:18

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх