2012-01-26 11 views
15

Me preguntaba si es posible volcar un programa Java que se ejecuta en un archivo, y más tarde en el reinicio él (misma máquina)Dumping un programa Java en un archivo y reiniciarlo

Es suena un poco raro, pero que sabe

--- ------- actualización

Sí, esta es la característica de hibernación para un proceso en lugar de un sistema completo. Pero google 'hibernate el proceso de jvm' y entenderás mi dolor.

Hay una pregunta para Linux sobre este tema (here). Rápidamente, es posible hibernar un proceso (lejos de ser 100% confiable) con CryoPID.

Hace algunos años se planteó una pregunta similar en stackoverflow.

Con una JVM, creo que la hibernación debe ser mucho más fácil, no siempre posible y no confiable al 100% (por ejemplo, IU y archivos).


Serializar un estado persistente de la aplicación es una opción, pero no es una respuesta a la pregunta.

+0

¿Quiere decir algo similar a la creación de un archivo guardado? – Max

+0

Hace décadas recuerdo haber leído las instrucciones sobre cómo podría volcar core el intérprete awk mientras estaba ejecutando un programa awk y luego volver a ejecutarlo desde el archivo central. En ese momento pensé que estaba bastante loco. –

+0

Esto suena raro. ¿Estás hablando de eliminar el código fuente de un programa Java en ejecución en un archivo de texto, compilar este código fuente y ejecutarlo? – Bernard

Respuesta

10

Esto puede ser un poco exagerado, pero una cosa que puede hacer es ejecutar algo como VirtualBox y detener/guardar la máquina.

También hay:
- JavaFlow from Apache que debe hacer eso a pesar de que no he probado personalmente ella.
- Brakes que puede ser exactamente lo que estás buscando

+0

Esta pregunta/respuesta también sugiere ir por la ruta VM: http://stackoverflow.com/questions/424341/are-herehere-any-java-vms-which-can-save-their- state-to-a-file-and-then-reload-that – jefflunt

7

Creo que lo que el PO está pidiendo es lo que los chicos de Smalltalk han estado haciendo durante décadas - almacenar todo el entorno de programación/ejecución en un archivo de imagen, y el trabajo en eso.

AFAIK no hay forma de hacer lo mismo en Java.

+0

¿Puedes hacer esto con Smalltalk? ¿Hay un nombre para esa función para poder buscarlo en Google? – Ajedi32

+0

Busque cómo guardar Smalltalk _image_, que debería ponerlo en el camino correcto;) –

7

Se han realizado algunas investigaciones para "persistir" en el estado de ejecución de la JVM y luego moverla a otra JVM y volver a iniciarla. Vi algo demostrado una vez pero no recuerdo cuál. No creo que se ha estandarizado en las especificaciones de JVM aunque ...

encontrado la presentación/demostración Estaba pensando, fue en 2005 que OOPSLA que estaban hablando de squawk

Buena suerte!

Otros enlaces de interés: Merpati

Aglets

M-JavaMPI

+0

Gracias, acercándose – ic3

+0

Buena suerte y publique de nuevo si encuentra una buena solución :) –

2

supongo IDE admite la depuración de tal manera. No es imposible, aunque no sé cómo. Puede ser que obtenga detalles si se contacta con algún contribuidor de eclipse o netbeans.

7

Existen muchas restricciones que cualquier solución a su problema tendrá: todas las conexiones externas pueden o no sobrevivir a su intento de congelarlas y despertarlas.Piense en los tiempos de espera en el otro lado, o incluso detenga a los socios de comunicación, desde un servidor web hasta una base de datos o incluso archivos locales.

Está solicitando una solución genérica, sin ningún conocimiento interno de su programa, que le gustaría hibernar. Lo que siempre puede hacer es serializar esa parte del estado de su programa, que necesita reiniciar su programa. Es, o al menos fue una sabiduría común para implementar el punto de reinicio en los cálculos de larga ejecución (piense en días o semanas). Por lo tanto, cuando aparece un error en su programa después de que se ejecuta durante una semana, puede corregir el error y guardar algunos días de cálculo.

El estado de un programa podría ser sorprendentemente pequeño, en comparación con el tamaño de memoria completo utilizado.

Ha preguntado "si es posible volcar un programa Java en ejecución en un archivo y luego reiniciarlo". - Sí, lo es, pero no sugeriría una solución genérica y automática que deba manejar su programa como una caja negra, pero le sugiero que externalice la parte importante del estado de sus programas y los puntos de reinicio del programa.

Espero que ayude, incluso si es más complicado de lo que esperabas.

+1

tomemos el escenario de que no hay recursos externos (archivos, db, conexiones ...) – ic3

+0

si se trata de una pregunta del mundo real, ¿qué hace tu aplicación: es un juego, un cruncher numérico, una simulación? –

+0

es una pregunta del mundo real, es un servidor OLAP (google iccube) – ic3

3

¿Qué le parece usar el marco SpringBatch?

Por lo que entendí de su pregunta, necesita alguna tarea java confiable y reanudable, si es así, creo que Spring Batch hará la magia, porque puede dividir su tarea (trabajo) en varios pasos mientras cada paso (y también todo el trabajo) tiene su propio contexto de ejecución persistido en un almacenamiento con el que elige trabajar.

En caso de falla, puede recuperar mediante el análisis de la ejecución anterior de un trabajo específico y reanudarlo desde el punto exacto donde ocurrió la falla.

También puede pausar y restart your job programmatically si el trabajo se configuró como reiniciable y el ExecutionContext para este trabajo ya existe.

¡Buena suerte!

0

En primer lugar debe diseñar su aplicación para usar el Memento pattern o cualquier otro patrón que le permita guardar el estado de su aplicación. El patrón del observador también puede ser una posibilidad. Una vez que su código está estructurado de manera que el estado de ahorro es posible, puede usar la serialización de Java para escribir realmente todos los objetos, etc. en un archivo en lugar de ponerlo en un DB.

Solo por 2 centavos.

0

Lo que quiere es imposible por la naturaleza misma de la arquitectura de la computadora.

Cada programa de Java se compila en código intermedio de Java y este código se interpreta en el código de la plataforma nativa (cuando se ejecuta). El código nativo es bastante diferente de lo que se ve en los archivos Java, porque depende de la plataforma subyacente y de la versión de JVM. Cada plataforma tiene diferentes conjuntos de instrucciones, administración de memoria, sistema de controladores, etc. Imagine que hiberna su programa en Windows y luego ejecútelo en Linux, Mac o cualquier otro dispositivo con JRE, como teléfono móvil, automóvil, lector de tarjetas , etc ... Todo el infierno se desataría.

Su solución es serializar todos los objetos importantes en archivos y luego cerrar el programa correctamente. Cuando "deshibe", deserializa estas instancias de estos archivos y su programa puede continuar. El número de instancias "importantes" puede ser bastante pequeño, solo necesita guardar los "datos comerciales", todo lo demás se puede reconstruir a partir de estos datos. Puede utilizar Hibernate o cualquier otro marco ORM para automatizar esta serialización sobre una base de datos SQL.

+0

La pregunta no está hibernando en un sistema operativo y comenzando en otro. – ic3

+0

Pensé que había pedido que hibernara el estado de JVM. Ese archivo sería transferible a cualquier otra computadora. –

+0

si es posible, esto sería genial – ic3

0

Probablemente terracota puede esto: http://www.terracotta.org

No estoy seguro, pero que están apoyando fallas en el servidor. Si todos los servidores se detienen, el proceso debería guardarse en el disco y esperar, creo.

De lo contrario, debe refactorizar su aplicación para mantener el estado explícitamente. Por ejemplo, si implementa algo como ejecutable y lo convierte en Serializable, podrá guardarlo.

3

Creo: 1- la única forma genérica es implementar la serialización. 2- una buena forma de restaurar un sistema en ejecución es la virtualización de OS 3- ahora usted está pidiendo algo así como la serialización de un solo proceso.

El problema son los IO. Dice que su proceso utiliza un archivo temporal que el sistema elimina después de 'hybernation', pero su programa no lo sabe. Tendrá una IOException en algún lugar.

Así es la palabra, si el programa no está diseñado para ser interrumpido al azar, no funcionará. Esa es una solución arriesgada e inmaculable, así que creo que solo 1,2 tienen sentido.

Cuestiones relacionadas