¿Hay una JVM por aplicación Java?


91

¿Se utiliza la misma JVM en todas las aplicaciones Java en ejecución o se aplica 'una JVM por aplicación Java'? (digamos que las aplicaciones son IntelliJ IDEA, un servidor y NetBeans, por ejemplo)

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


2
Esta es una gran pregunta. :)
Jamie

Respuestas:


81

En términos generales, 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í.

Hay algunos detalles de implementación, como Class Data Sharing , donde varias instancias de JVM pueden compartir algunos datos / memoria, pero no tienen ningún efecto visible para el usuario en las aplicaciones (excepto por un 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 múltiples aplicaciones web. En este caso, varias aplicaciones web pueden compartir una JVM.


21

Hay una JVM por aplicación Java. No debería haber ninguna conexión entre ellos a menos que establezca una, por ejemplo, con redes. Si está trabajando dentro de un IDE, el código que escribe generalmente se ejecuta en una JVM separada. El IDE normalmente conectará la JVM separada para la depuración. Si está tratando con varias aplicaciones web, podrían compartir la misma JVM si se implementan en el mismo contenedor web.


12

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

  • La JVM tiene un conjunto de System.in/ out/ err, una codificación predeterminada, una configuración regional predeterminada, un conjunto de propiedades del sistema, etc. Si una aplicación los cambia, afectará a todas las aplicaciones.
  • Cualquier aplicación que llame System.exit()mata todas las aplicaciones.
  • Si un hilo de aplicación se vuelve loco y consume demasiada CPU o memoria, también afectará a las otras aplicaciones.

8

El número de JVM en ejecución 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.


8

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 por qué serlo.

Todo depende de lo que consideres una 'aplicación'. Un IDE es un buen ejemplo de una aplicación que se presenta a sus usuarios finales (es decir, nosotros) como una sola entidad, pero que en realidad está compuesta por múltiples aplicaciones subyacentes (compiladores, ejecutores de prueba, herramientas de análisis estático, empaquetadores, administradores de paquetes, proyectos / herramientas de gestión de dependencias, etc.). En ese caso, hay una variedad de trucos que el IDE utiliza para garantizar que el usuario experimente una experiencia integrada y al mismo tiempo esté protegido (hasta cierto punto) de los caprichos individuales de las herramientas subyacentes. Uno de esos trucos es hacer algunas cosas en una JVM separada, comunicándose a través de archivos de texto o mediante las funciones de depuración a nivel de la aplicación.

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

Entonces, todo depende realmente de lo que consideres applicationque es. Si está hablando puramente de "lo que se ejecuta cuando se llama a 'main ()'", entonces está viendo una aplicación por JVM; cuando el sistema operativo inicia la JVM, la JVM ejecuta el public static void main()método de una sola clase .

Pero una vez que sus aplicaciones comienzan a complicarse, sus límites se vuelven más borrosos. Un IDE como Intellij o Eclipse reutilizará gran parte del mismo material que 'javac', ya sea en la misma JVM o en una diferente, además de realizar un trabajo diferente (como volver a pintar la pantalla). Y los usuarios de una aplicación web en un servidor de aplicaciones (JVM compartido) pueden estar usando la misma aplicación 'central' que podría usarse localmente a través de la línea de comandos.


5

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 excepto por algo de memoria guardada.


2

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

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

pspara enumerar el proceso, grepbuscar el proceso que contiene "java" y wccontar las líneas devueltas


0

En realidad, esta es una pregunta que puede tener respuestas muy confusas. Para que sea realmente breve:

  1. Sí, por proceso de Java, por JVM.
  2. Runtime y ProcessBuilder siguen esta regla.
  3. Cargar jarras usando la reflexión y luego ejecutar la principal no generará una nueva JVM.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.