Resposta curta: geralmente, sim, você obterá um aplicativo por JVM. Resposta longa: a JVM pode ser usada dessa forma, e essa pode ser a melhor opção, mas não precisa ser.
Tudo depende do que você considera ser um 'aplicativo'. Um IDE é um bom exemplo de um aplicativo que é apresentado a seus usuários finais (ou seja, nós) como uma entidade única, mas que na verdade é composto de vários aplicativos subjacentes (compiladores, executores de teste, ferramentas de análise estática, empacotadores, gerenciadores de pacotes, projeto / ferramentas de gerenciamento de dependências, etc). Nesse caso, há uma variedade de truques que o IDE usa para garantir que o usuário experimente uma experiência integrada, ao mesmo tempo em que está protegido (até certo ponto) dos caprichos individuais das ferramentas subjacentes. Um desses truques é fazer algumas coisas em uma JVM separada, comunicando-se por meio de arquivos de texto ou por meio dos recursos de depuração no nível do aplicativo.
Os servidores de aplicativos (Wildfly, Glassfish, Websphere, Weblogic, etc) são aplicativos cuja razão de ser é atuar como contêineres para outros aplicativos serem executados. Nesse caso, de uma perspectiva, há um único JVM por aplicativo (ou seja, um JVM é usado para executar todo o servidor de aplicativos), mas na verdade existem vários aplicativos contidos nessa JVM, cada um logicamente separado um do outro em seu próprio carregador de classe (reduzindo a possibilidade de interferência acidental no processo).
Então, tudo realmente depende do que você considera application
ser. Se você está falando puramente sobre "o que é executado quando 'main ()' é chamado", então você está olhando para um aplicativo por JVM - quando o sistema operacional inicia a JVM, a JVM executa um public static void main()
método de classe única .
Mas, uma vez que seus aplicativos começam a ficar mais complicados, seus limites se tornam mais confusos. Um IDE como o Intellij ou Eclipse reutilizará muitas das mesmas coisas que o 'javac', na mesma JVM ou em uma diferente, além de fazer um trabalho diferente (como redesenhar a tela). E os usuários de um aplicativo da web em um servidor de aplicativos (JVM compartilhado) podem, na verdade, estar usando quase o mesmo aplicativo 'núcleo' que poderia ser usado localmente por meio da linha de comando.