Algoritmo esperado:
- Você inicia a JVM sem o aplicativo real (apenas informando para carregar alguns jars), carrega e escuta um soquete e aguarda em segundo plano.
- Quando você inicia o aplicativo (
preloaded_java -cp /usr/share/java/....jar:. qqq.jar
), ele se conecta à JVM carregada existente, carrega jars adicionais (se houver) e executa a classe principal. preloaded_java
apenas rotas de entrada e saída e lida com interrupções etc.
Atualização Implementada uma prova de conceito: 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
Atualização 2 : Encontrei a resposta: servidor Nailgun (do VimClojure).
Não, o que você descreve não é possível, pelo menos não com a Sun JVM, simplesmente porque ela não está implementada (embora seja uma boa ideia).
No entanto, se você simplesmente executar o aplicativo uma vez, o sistema operacional armazenará em cache os dados na RAM que foi carregada do disco, portanto, as inicializações subseqüentes deverão ser muito mais rápidas. Isso já pode ajudar.
Se você precisa de um aumento de velocidade: você pode, talvez, alterar o aplicativo, de modo que ele continue sendo executado e aceite novas entradas?
fonte
Claro que isso pode ser feito. O que você descreve é, na verdade, muito parecido com o funcionamento de um servidor de aplicativos Java EE.
fonte