Existe um daemon da JVM?

6

Estou curioso, existe uma JVM que é executada como um daemon do SO e bifurca quando um novo processo deve ser iniciado nele (ou seja, como o init ou o processo zygote no Android)? Se não, porque não? Não estou falando de um encadeamento do daemon dentro da JVM.

A razão pela qual estou perguntando é porque o tempo de inicialização da JVM é bastante lento e gera muitos problemas com scripts.

    
por zacsek 05.03.2012 / 21:56

4 respostas

7

JVM startup time is quite slow, and incurs a heavy toll on scripting . . . huge optimization for java process startup time.

As outras respostas respondem à pergunta relacionada à inicialização de aplicativos genéricos, que são considerações úteis.

Mas parece que sua principal questão é o desempenho de inicialização do aplicativo Java e a sobrecarga de iniciar um jvm. Esta também tem sido minha pergunta. Eu encontrei isto:

Se estiver disposto a sacrificar a segurança de separação do usuário, confira Nailgun, um Java incrivelmente rápido :

Nailgun is a client, protocol, and server for running Java programs from the command line without incurring the JVM startup overhead. Programs run in the server (which is implemented in Java), and are triggered by the client (written in C), which handles all I/O.

    
por 22.08.2012 / 14:06
6

O Android usa um único processo Zygote que se bifurca para iniciar um novo aplicativo. Essa otimização é possível porque todos os aplicativos Android são iniciados no mesmo ambiente; há muito pouco a fazer (principalmente definir o usuário e carregar o código do aplicativo) para iniciar um aplicativo. Essa otimização é eficaz porque há pouco a ser feito, especialmente porque o processo Zygote já possui as bibliotecas vinculadas.

Em um sistema unix, as suposições que se baseiam no Zygote não são atendidas. Cada processo começa com suas próprias variáveis de ambiente, seus próprios arquivos abertos, seus próprios limites de uso, seu próprio usuário e grupos, etc. Você não pode transferir todas essas propriedades de um processo para outro (você pode transferir algumas, mas mesmo assim significaria tempo de inicialização adicional). Além disso, existe uma vasta gama de diferentes bibliotecas usadas por diferentes aplicações; cada aplicativo teria que carregar o seu próprio. Uma otimização do tipo zigoto não é nem possível em geral nem, em muitos casos, realmente útil, mesmo quando é possível.

Você pode escrever um programa em Java que seja um daemon. É algo que você precisa administrar aplicativo por aplicativo. Você pode fazer com que o seu aplicativo inicie como daemon e fork quando receber uma nova requisição. Cabe a você decidir o que fazer ao bifurcar-se.

    
por 06.03.2012 / 02:16
1

Qualquer processo, incluindo um programa java, pode ser executado como um daemon. A verdadeira questão é se a implementação Java tem todas as chamadas do sistema para torná-lo um "processo de daemon adequado" (por exemplo, processamento de sinal, manipulação de grupo de sessão / processo, etc.). Você pode querer olhar para a API do Daemon do Java .

Além disso, como o forking criará uma cópia do programa em execução, não haverá custos iniciais, apenas o custo de criação de novas estruturas de dados do processo dentro do sistema operacional. A execução de um exec subsequente pode incorrer em custos iniciais. O encadeamento geralmente é usado no lugar de bifurcar programas Java, pois já existe uma API estável.

    
por 05.03.2012 / 22:53
1

Na verdade, os servidores de aplicativos, como o JBoss, fornecem uma funcionalidade semelhante a (mas não igual a) o que você está pedindo: um processo Java é executado em segundo plano e você pode instruí-lo para iniciar um subaplicativo. A desvantagem dessa abordagem, no entanto, é que os sub-aplicativos não são iniciados como processos separados, portanto, eles não são separados com segurança: se um deles trava a VM ou chama System.exit () ou decide interromper () todos os Threads , todas as outras sub-aplicações também são afetadas.

    
por 22.08.2012 / 15:16

Tags