usar - En Java, ¿los miembros de la clase estática se comparten entre programas?
static final que es (7)
En Java, ¿los miembros de la clase estática se comparten entre programas?
Una clase se define por su nombre completo y el cargador de clases que la cargó. Si la misma clase está dentro del mismo proceso JVM y los dos programas cargaron la clase a través del mismo cargador de clases, entonces los miembros estáticos se comparten. Las reglas de carga de clases son de extrema importancia.
Me imagino que no, no lo son, porque cada proceso tiene su propio espacio de memoria, por supuesto.
Si está utilizando dos JVM separadas para iniciar dos aplicaciones, está en lo correcto. Pero tome el caso de los contenedores de aplicaciones / servlets como tomcat: cargan varias aplicaciones a través del mismo proceso (el proceso de host tomcat).
Pero, ¿cómo funciona todo el JVM? ¿Hay una JVM separada en un proceso separado para cada programa Java que lanzo? ¿Los programas Java que se ejecutan en un sistema comparten algo en absoluto?
Cada vez que escribe >java -cp...
en la línea de comandos, está creando un nuevo proceso. Tenga en cuenta que cuando ejecuta eclipse o llama a una tarea ant java con fork=true
, también está creando nuevos procesos.
¿Hay diferencias entre los sistemas operativos y las implementaciones de JVM? ¿Puedo hacer que los programas compartan variables (es decir, directamente a través de la JVM en lugar de los mecanismos habituales de IPC)? ¿Hay más JVM de un solo proceso exóticos para fines especiales?
Como decía un cartel, hay proyectos como Terracota que te lo facilitan. Un enfoque general para este tipo de intercambio es un caché distribuido.
Me imagino que no, no lo son, porque cada proceso tiene su propio espacio de memoria, por supuesto.
Pero, ¿cómo funciona todo el JVM? ¿Hay una JVM separada en un proceso separado para cada programa Java que lanzo? ¿Los programas Java que se ejecutan en un sistema comparten algo en absoluto? ¿Hay diferencias entre los sistemas operativos y las implementaciones de JVM? ¿Puedo hacer que los programas compartan variables (es decir, directamente a través de la JVM en lugar de los mecanismos habituales de IPC)? ¿Hay más JVM de un solo proceso exóticos para fines especiales?
En general, ¿cuáles son las lecturas recomendables sobre las entrañas de las JVM? La spec ? ¿El código fuente de alguna implementación? Sitios web? ¿Libros?
Depende de la implementación, pero sí, hay maneras de compartir las cosas. Hay trabajo en curso para cambiar eso, y Sun (a través de Apple) ha hecho un gran trabajo para compartir datos entre instancias de la máquina virtual. Hay un enlace que discute algo de eso here .
Para hacer cualquier tipo de intercambio requiere que el implementador de VM lo haga, usted como programador no puede hacer nada para que esto suceda.
La especificación de la VM está here , también hay algunos libros (más antiguos) sobre ella. También puede consultar la fuente de Kaffe que es bastante pequeña.
No, las variables estáticas no están entre las JVM. Sí, hay un proceso JVM separado para cada aplicación Java que ejecute.
En algunas implementaciones, creo que pueden compartir algunos recursos (por ejemplo, memoria para el código JIT de clases JRE) pero no estoy seguro. Creo que hay trabajo en curso para permitir más intercambio, pero aún de una manera robusta. (Realmente no quieres que una JVM se vea afectada para afectar a otros).
No, no puedes hacer que los programas compartan variables de forma transparente.
Creo que hay libros sobre la JVM, pero no puedo recomendar ninguno. Probablemente sea mejor que busques documentos de HotSpot para obtener más detalles. Este es un buen punto de partida.
Si desea compartir variables a través de JVM, puede mirar productos de agrupamiento en clúster como Terracotta . Se refieren a sí mismos como "memoria conectada a la red" y le permiten compartir referencias de objetos a través de JVM usando tecnología de replicación.
Solo para seguir con lo que Kevin mencionó, no hay implementaciones de JVM que yo sepa que le permitan compartir variables estáticas a través de instancias de JVM. Como han indicado (correctamente) las respuestas anteriores, cada instancia de JVM es su propio proceso.
La terracota (que es una tecnología de agrupación en clúster, no una JVM) permite compartir arbitrariamente las instancias de objetos a través de los límites del proceso de JVM, incluida la distribución de variables estáticas. Por lo tanto el apodo "red de memoria adjunta". Para todos los efectos, cuando se utiliza la tecnología Terracotta en su proceso JVM, todos los subprocesos en todas las máquinas virtuales se comportan como si todos estuvieran mirando un montón único, grande, compartido. (Por supuesto, ya que esto no es físicamente posible, Terracotta lo administra a través de sofisticados algoritmos de compartición y replicación que involucran a la red io para mover datos, por lo que hay momentos en que la latencia y el rendimiento no se comparan con el acceso a la memoria nativa)
Hay abundantes ejemplos en la sección de libros de cocina del sitio de Terracota. Le recomiendo que comience con la Receta de instancia de clúster Hello para tener una idea de cómo funciona.
Usted es correcto en su suposición. Sí, cada JVM es un proceso separado. Puede confirmar esto abriendo el Administrador de tareas cuando esté ejecutando dos programas Java (ordene los procesos por nombre y busque java.exe o javaw.exe).
Es posible hacer que las JVM se conecten entre sí (con sockets locales, por ejemplo), pero no hay nada integrado.
probablemente debería buscar más en el área de carga de clases si su interés principal es cómo se crea una instancia de los miembros de clases estáticas.
Diferentes subprocesos en la misma VM pueden tener sus propias instancias de miembros de clase estática si utilizan cargadores de clases separados.
El ejemplo clásico aquí sería Apache Tomcat manteniendo diferentes aplicaciones web separadas, aunque los archivos lib pueden ser comunes a todas las aplicaciones.