2009-01-08 12 views

Respuesta

10

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 ser capaz de reiniciar su PC, encender la máquina virtual cuando se recupera y hacer que el proceso de Java retome desde donde estaba.

Uso VMWare Player para probar IE en el trabajo, y esto funciona como se indica arriba cuando cierro y luego lo vuelvo a abrir. En general, no hago esto cuando las aplicaciones hacen algo importante en la VM, pero mientras no accedan a ningún recurso externo (por ejemplo, sockets de red), esperaría que funcionara como si la VM nunca se apagara .

4

Debe serializar objetos específicos del dominio que pueden ser deserializados por otro tiempo de ejecución de JVM.

No conozco ninguna herramienta que persista en una JVM completa. Lo más cerca que pude de hacer esto fue crear un volcado del núcleo de un proceso JVM en ejecución usando gcore, luego usando 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 

ACTUALIZACIÓN

no creo que vas a encontrar una solución que es portátil entre las arquitecturas todavía.

3

He trabajado en an embedded Java project que utilizó este enfoque para arrancar rápidamente. La JVM era de Wind River, que se ejecuta sobre VxWorks.

2

Que yo sepa, no hay nada para capturar el estado JVM y restaurarlo, pero la gente está tratando de serializar/deserializar la clase Thread para lograr algo similar. Lo más parecido a una implementación de trabajo que encontré fue brakes, pero puede encontrar más información cuando busque la "serialización de subprocesos" en google.

4

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

1

Si usted puede conseguir lejos con sólo almacenar el estado de los objetos en memoria, entonces algo así como poder Prevaylor trabajo para ti. Utiliza una combinación de cambios de diario en objetos comerciales con una instantánea serializada para registrar el estado de los 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, entonces podría ser necesaria una JVM especializada.

4

No conozco las JVM que pueden almacenar estado. Dependiendo de sus necesidades exactas, quizás pueda considerar usar Terracotta. Terracota es esencialmente capaz de compartir el estado del montón entre las JVM, y almacenar este estado en el disco.

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

Espero que esto ayude.

4

Continuations están probablemente sea lo que buscas:

[...] continuaciones de primera clase, que son construcciones que le dan un lenguaje de programación de la capacidad para guardar el estado de ejecución en cualquier punto y regrese a ese punto al un punto posterior en el programa.

Existen al menos dos bibliotecas de continuación para Java: RIFE continuations y javaflow. Sé que javaflow al menos permite la serialización de estado en el disco:

Un Continuation se puede serializar si todos los objetos que capturó también es serializable. En otras palabras, todas las variables locales (incluidos todos los objetos this) deben marcarse como Serializable. En este ejemplo, usted necesita marcar la clase MyRunnable como Serializable. Una continuación serializada de se puede enviar a otra máquina o se puede usar más adelante. - Javaflow Tutorial

+0

Dalma (https://dalma.dev.java.net/) aparentemente también hace continuaciones. –

+0

Las continuas son geniales y todas, pero solo funcionan dentro de un proceso en ejecución para ahorrar algo de trabajo para más adelante mientras continúa haciendo otras cosas. La pregunta parece ser restablecer el programa y JVM a un estado anterior (posiblemente con un apagado intermedio). –

+0

@Pontus Gagge: No leyó la segunda cita. Las continuaciones de javaflow serializan la pila y todo. Se pueden volver a cargar desde el disco más tarde. Incluso en una máquina diferente. – waqas

2

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

Me pregunto cuántos componentes de framework y bibliotecas se romperían tales funcionalidades. De repente, estás restableciendo un estado JVM del almacenamiento; Mientras tanto, el reloj se ha saltado misteriosamente en 23 horas, las conexiones de red ya no son válidas, los objetos GUI ya no tienen ningún control subyacente de O/S ... Diría que esto no es trivial, e imposible en el caso general sin modificando el marco extensamente.

+0

Esos son los mismos problemas que enfrenta su sistema operativo en hibernación o que un servidor de VM hace una pausa en una máquina virtual, presumiblemente se manejarían o, más exactamente, no se manejarían de la misma manera. – SCdF

+0

... con la diferencia de que el O/S y las pilas de controladores realmente saben sobre la hibernación y pueden empaquetar/descomprimir las cosas de manera apropiada. Aquí, un proceso que ocurre para contener la JVM se convierte en amnésico y espera que todo funcione ... –

+0

Esto es exactamente lo que sucede cuando cierro la tapa de la computadora portátil: la computadora se queda dormida. Abro la tapa del portátil y las aplicaciones continúan donde lo dejaron. Sí, si tengo una toma abierta en el momento en que cierro la tapa, entonces el enchufe está cerrado. la VM no debería ser diferente. – jdkoftinoff

1

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

Usted podría llegar a mitad de camino, dependiendo de la complejidad de su aplicación, con sólo la serialización de estado cuando el programa se cierra y la serialización de nuevo, pero eso no va a hacer cosas como pausa ejecutar alguna lógica de negocio cuando cierra y luego continúa cuando lo abre de nuevo.

Cuestiones relacionadas