¿Existen máquinas virtuales Java que puedan guardar su estado en un archivo y luego volver a cargar ese estado?

StackOverflow https://stackoverflow.com/questions/424341

Pregunta

¿Existen máquinas virtuales Java que puedan guardar su estado en un archivo y luego volver a cargar ese estado?

Si es así, ¿cuáles?

¿Fue útil?

Solución

Otra opción, que puede o no ser relevante en su caso, es ejecutar la JVM (cualquier JVM) dentro de una máquina virtual. La mayoría de las máquinas virtuales ofrecen la opción de almacenar y reanudar el estado, por lo que debería poder reiniciar su PC, encender la máquina virtual cuando se reinicia y hacer que el proceso de Java retome el proceso desde donde estaba.

Uso VMWare Player para realizar pruebas en IE en el trabajo, y esto funciona como se indicó anteriormente cuando lo cierro y luego lo vuelvo a abrir. Generalmente no hago esto cuando las aplicaciones están haciendo algo importante en la máquina virtual, pero siempre y cuando no tengan acceso a recursos externos (por ejemplo, sockets de red), esperaría que funcionara como si la máquina virtual nunca se apagara .

Otros consejos

Continuaciones son probablemente lo que está buscando:

  

[...] continuaciones de primera clase, que son construcciones   que dan un lenguaje de programación al   Capacidad de guardar el estado de ejecución en   cualquier punto y volver a ese punto en   Un punto posterior en el programa.

Hay al menos dos bibliotecas de continuación para Java: continuaciones RIFE y javaflow . Sé que javaflow al menos permite serializar el estado en el disco:

  

Un Continuación puede ser serializado si   todos los objetos que capturó es también   serializable. En otras palabras, todos los   variables locales (incluyendo todo this   objetos) deben ser marcados como    Serializable . En este ejemplo, usted   Necesito marcar la clase MyRunnable como   Serializable. Un serializado   la continuación puede ser enviada a   Otra máquina o utilizada más tarde. - Tutorial de Javaflow

Debería serializar objetos relevantes de dominio específicos que puedan ser serializados por otro tiempo de ejecución de JVM.

No tengo conocimiento de ninguna herramienta que persista en una JVM completa. Lo más cerca que pude hacer esto fue crear un volcado de núcleo a partir de un proceso JVM en ejecución usando gcore , luego utilice jsadebugd , jmap o jstack para depurarlo.

Por ejemplo:

$ jps # get JVM process ID XXX
$ gcore -o core XXX
$ jsadebugd $JAVA_HOME/bin/java core.XXX

ACTUALIZAR

No creo que vayas a encontrar una solución que sea portátil entre arquitecturas por el momento.

Vale la pena señalar que muchos objetos no pueden ser serializados ya que tienen un estado fuera del contexto de Java. p.ej. Sockets, hilos, archivos abiertos, conexiones de base de datos. Por este motivo, es difícil guardar el estado de una aplicación útil de forma genérica.

No estoy al tanto de las JVM que pueden almacenar el estado. Dependiendo de sus necesidades exactas, tal vez pueda considerar el uso de terracota. La terracota es esencialmente capaz de compartir el estado de almacenamiento dinámico entre las JVM y almacenar este estado en el disco.

Esto se puede usar para agrupar aplicaciones y / o hacer que el estado de pila sea persistente. En efecto, puede usarlo para iniciar la JVM y continuar donde lo dejó. Para más información echa un vistazo a: http://www.infoq.com/articles/open-terracotta-intro

Espero que esto ayude.

He trabajado en un proyecto Java incrustado que se utilizó Este enfoque para iniciar rápidamente. La JVM era de Wind River y se ejecutaba sobre VxWorks.

Sun ha realizado algunas investigaciones sobre la "persistencia ortogonal", que proporciona la persistencia para el modelo computacional completo que está definido por la especificación del lenguaje Java & # 64257; cation " ;:

http: //research.sun .com / forest / COM.Sun.Labs.Forest.doc.opjspec.abs.html

PJama es una implementación prototipo:

http://research.sun.com/forest/opj.main.html

Que yo sepa, no hay nada que capture el estado de JVM y lo restaure, pero las personas están intentando serializar / deserializar la clase Thread para lograr algo similar. Lo más cercano a una implementación operativa que encontré fue frenos , pero es posible que encuentre más cuando busque en Google " serialización de subprocesos " ;.

Supongo que desea poder reanudar desde donde se almacenó la instantánea, como si no hubiera ocurrido nada después.

Me pregunto cuántos componentes de framework y bibliotecas se romperían con esa funcionalidad. De repente, estás reviviendo un estado JVM desde el almacenamiento; Mientras tanto, el reloj ha saltado misteriosamente hacia adelante por 23 horas, las conexiones de red ya no son válidas, los objetos de la GUI ya no tienen ningún control O / S subyacente ... Yo diría que esto no es trivial, e imposible en el caso general sin Modificando el framework extensivamente.

Si puede escapar simplemente almacenando el estado de sus objetos en memoria, entonces algo como Prevaylor podría trabajar para usted. Utiliza una combinación de cambios diarios en los objetos comerciales con una instantánea serializada para registrar el estado de sus objetos, que luego puede volver a cargar.

Sin embargo, no almacena el estado completo de JVM (pila de llamadas, estado del GC, etc.). Si realmente necesita ese nivel de detalle, es posible que necesite una JVM especializada.

La respuesta en este momento es no , no hay JVM que puedan "hibernar" como su sistema operativo puede o como VMWare y otros pueden.

Usted podría llegar a mitad de camino, dependiendo de la complejidad de su aplicación, simplemente serializando el estado cuando el programa se cierra y serializándolo de nuevo, pero eso no hará nada como pausar ejecutando algo de lógica de negocios cuando cierra y luego continúa cuando la abre de nuevo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top