¿Existen máquinas virtuales Java que puedan guardar su estado en un archivo y luego volver a cargar ese estado?
-
05-07-2019 - |
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?
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 todothis
objetos) deben ser marcados comoSerializable
. 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:
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.