É possível pré-carregar a JVM para tornar mais rápida a inicialização de pequenos aplicativos java?

7

Algoritmo esperado:

  1. Você inicia a JVM sem o aplicativo real (apenas informando para carregar alguns jars), carrega e escuta um soquete e aguarda em segundo plano.
  2. 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.
  3. preloaded_java apenas direciona entrada e saída e lida com interrupções etc.

Atualização Implementada uma prova de conceito: link

$ 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).

    
por Vi. 14.09.2010 / 23:26

3 respostas

3

Use o servidor Nailgun:

Comece:

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

Use:

$ ng clojure.main 
Clojure 1.2.0
user=>

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

Ele pode ser obtido com o VimClojure: link

    
por 18.09.2010 / 02:15
0

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?

    
por 15.09.2010 / 00:41
0

Claro que isso pode ser feito. O que você descreve é, na verdade, muito semelhante ao funcionamento de um servidor de aplicativos Java EE.

    
por 15.09.2010 / 09:56

Tags