2011-05-10 15 views
54

¿Es la misma JVM utilizada por todas las aplicaciones Java que se ejecutan o se aplica 'una JVM por aplicación Java'? (supongamos que las aplicaciones son IntelliJ IDEA, un servidor y NetBeans por ejemplo)¿Hay una JVM por aplicación Java?

Además, ¿hay alguna conexión entre las JVM asignadas y los procesos utilizados por cada aplicación Java?

Respuesta

12

Hay una JVM por aplicación Java. No debe haber ninguna conexión entre ellos a menos que establezcas uno, p. con la creación de redes. Si está trabajando dentro de un IDE, el código que escribe generalmente se ejecuta en una JVM separada. El IDE generalmente conectará la JVM separada para la depuración. Si se trata de múltiples aplicaciones web, podrían compartir la misma JVM si se implementan en el mismo contenedor web.

6

El número de JVM que se ejecutan es el número de ejecutables invocados. Cada una de estas aplicaciones invoca su propio ejecutable Java (java.exe/javaw.exe etx para Windows), lo que significa que cada una se ejecuta en una JVM separada.

52

En general, cada aplicación obtendrá su propia instancia de JVM y su propio proceso de nivel de sistema operativo y cada instancia de JVM es independiente entre sí.

Existen algunos detalles de implementación como Class Data Sharing, donde varias instancias de JVM pueden compartir algunos datos/memoria, pero esos no tienen efecto visible para el usuario para las aplicaciones (con la excepción del tiempo de inicio mejorado, con suerte).

Sin embargo, un escenario común es un único servidor de aplicaciones (o "servidor web") como Glassfish o Tomcat que ejecutan varias aplicaciones web. En este caso, varias aplicaciones web pueden compartir una JVM.

4

Cualquier aplicación que tenga bibliotecas compartidas compartirá la misma copia de esas bibliotecas. Java tiene una buena cantidad de bibliotecas compartidas. Sin embargo, no notará la diferencia a excepción de alguna memoria guardada.

6

En teoría, puede ejecutar múltiples aplicaciones en una JVM. En la práctica, pueden interferir entre sí de varias maneras. Por ejemplo:

The JVM has one set of System.in/out/err, one default encoding, one default locale, one set of system properties, and so on. If one application changes these, it affects all applications. 
Any application that calls System.exit() kills all applications. 
If one application thread goes wild, and consumes too much CPU or memory it will affect the other applications too. 

Refrence

1

poco tarde aquí, sin embargo esta información puede ser útil para alguien. En un sistema Linux, si desea saber cuántos JVM está ejecutando puede probar este comando

$ ps -ef | grep "[j]ava" | wc -l 

ps proceso para enumerar, grep al proceso de búsqueda que contienen "java" y wc a contar las líneas volvieron

1

Respuesta corta: a menudo, sí, obtendrá una aplicación por JVM. Respuesta larga: la JVM se puede usar de esa manera, y esa puede ser la mejor opción, pero no tiene que ser así.

Todo depende de lo que usted considere una 'aplicación'. Un IDE es un buen ejemplo de una aplicación que se presenta a sus usuarios finales (es decir, a nosotros) como una única entidad, pero que en realidad está compuesta por múltiples aplicaciones subyacentes (compiladores, corredores de prueba, herramientas de análisis estático, empaquetadores, gestores de paquetes, proyectos/herramientas de gestión de dependencia, etc.). En ese caso, hay una variedad de trucos que utiliza el IDE para garantizar que el usuario experimente una experiencia integrada mientras que también está protegido (en cierta medida) de los caprichos individuales de las herramientas subyacentes.Uno de estos trucos es hacer algunas cosas en una JVM separada, comunicándose a través de archivos de texto oa través de las instalaciones de depuración a nivel de aplicación.

Los servidores de aplicaciones (Wildfly, Glassfish, Websphere, Weblogic, etc.) son aplicaciones cuya razón de ser es actuar como contenedores para que otras aplicaciones se ejecuten. En ese caso, desde una perspectiva, hay una sola JVM por aplicación (es decir, una JVM se usa para ejecutar todo el servidor de aplicaciones), pero en realidad hay varias aplicaciones contenidas dentro de esa JVM por sí mismas, cada una separada lógicamente entre sí en su propio cargador de clases (reduciendo la posibilidad de una diafonía accidental en el proceso).

Por lo tanto, todo depende de lo que considere un application. Si solo está hablando de "lo que se ejecuta cuando se llama a 'main()', entonces está buscando una aplicación por JVM: cuando el SO inicia la JVM, la JVM ejecuta el método de una sola clase public static void main().

Pero una vez que sus aplicaciones se vuelven más complicadas, sus límites se vuelven más borrosos. Un IDE como Intellij o Eclipse reutilizará muchas de las mismas cosas que 'javac', ya sea en la misma JVM o en una diferente, y también haciendo diferentes trabajos (como volver a pintar la pantalla). Y los usuarios de una aplicación web en un servidor de aplicaciones (JVM compartido) pueden estar usando prácticamente la misma aplicación 'core' que podría usarse localmente a través de la línea de comando.

Cuestiones relacionadas