Domanda

Esistono VM Java che possono salvare il loro stato in un file e quindi ricaricare quello stato?

In caso affermativo, quali?

È stato utile?

Soluzione

Un'altra opzione, che può o meno essere rilevante nel tuo caso, è quella di eseguire la JVM (qualsiasi JVM) all'interno di una macchina virtuale. La maggior parte delle macchine virtuali offre la possibilità di archiviare e riprendere lo stato, quindi dovresti essere in grado di riavviare il PC, riavviare la VM al momento del backup e far riprendere il processo Java da dove si trovava.

Uso VMWare Player per i test su IE al lavoro e questo funziona come indicato sopra quando lo chiudo e successivamente lo riapro. In genere non lo faccio quando le app stanno facendo qualcosa di interessante nella VM, ma fintanto che non accedono a risorse esterne (ad esempio socket di rete), mi aspetto che funzioni come se la VM non fosse mai spenta .

Altri suggerimenti

Continuazioni è probabilmente quello che stai cercando:

  

[...] continuazioni di prima classe, che sono costrutti   che danno a un linguaggio di programmazione il   possibilità di salvare lo stato di esecuzione in   qualsiasi punto e tornare a quel punto in   un punto successivo nel programma.

Esistono almeno due librerie di continuazione per Java: Continuazioni RIFE e javaflow . So che javaflow almeno consente lo stato di serializzazione su disco:

  

Un Continuation può essere serializzato se   anche tutti gli oggetti catturati   serializzabile. In altre parole, tutto il   variabili locali (incluso tutto this   oggetti) devono essere contrassegnati come    Serializable . In questo esempio, tu   è necessario contrassegnare la classe MyRunnable come   Serializzabile. Un serializzato   la continuazione può essere inviata a   un'altra macchina o utilizzata in seguito. - Tutorial Javaflow

È necessario serializzare gli oggetti specifici specifici del dominio che possono essere serializzati da un altro runtime JVM.

Non sono a conoscenza di strumenti che persistono in un'intera JVM. Il più vicino a questo è stato la creazione di un dump principale da un processo JVM in esecuzione utilizzando gcore , quindi utilizzando jsadebugd , jmap o jstack per eseguire il debug.

Ad esempio:

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

Aggiorna

Non credo che troverai ancora una soluzione portatile tra architetture.

Vale la pena notare che molti oggetti non possono essere serializzati poiché hanno uno stato al di fuori del contesto java. per esempio. Zoccoli, thread, file aperti, connessioni al database. Per questo motivo, è difficile salvare lo stato di un'applicazione utile in modo generico.

Non sono a conoscenza di JVM in grado di memorizzare lo stato. A seconda delle tue esatte esigenze, potresti forse prendere in considerazione l'uso di Terracotta. Terracotta è essenzialmente in grado di condividere lo stato dell'heap tra JVM e di archiviare questo stato su disco.

Può essere usato per raggruppare applicazioni e / o rendere persistente l'heapstate. In effetti, puoi usarlo per avviare la JVM e riprendere da dove avevi interrotto. Per maggiori informazioni, consulta: http://www.infoq.com/articles/open-terracotta-intro

Spero che questo aiuti.

Ho lavorato su un progetto Java incorporato che ha utilizzato questo approccio per avviarsi rapidamente. La JVM era di Wind River, in esecuzione su VxWorks.

Sun ha fatto alcune ricerche sulla "persistenza ortogonale", che fornisce la "persistenza per l'intero modello computazionale che è de" # 64257; nedby il Java Speci & # 64257; cation " ;:

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

PJama è un'implementazione prototipo:

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

Per quanto ne so, non c'è nulla per catturare lo stato JVM e ripristinarlo, ma le persone stanno cercando di serializzare / deserializzare la classe Thread per ottenere qualcosa di simile. La cosa più vicina a un'implementazione funzionante che ho trovato era brakes , ma potresti trovarne di più quando cerchi Google per la "serializzazione dei thread".

Presumo che tu voglia essere in grado di riprendere da dove è stata memorizzata l'istantanea, come se nulla fosse accaduto in seguito.

Mi chiedo quanti componenti del framework e librerie tale funzionalità si spezzerebbe. Improvvisamente, stai ripristinando uno stato JVM dalla memoria; nel frattempo, l'orologio è misteriosamente saltato in avanti di 23 ore, le connessioni di rete non sono più valide, gli oggetti GUI non hanno più handle O / S sottostanti ... Direi che non è banale, e impossibile nel caso generale senza modificando ampiamente il framework.

Se riesci a cavartela solo con la memorizzazione dello stato dei tuoi oggetti in memoria, allora qualcosa come Prevaylor potrebbe funzionare per te. Utilizza una combinazione di modifiche di journaling agli oggetti business con uno snapshot serializzato per registrare lo stato dei tuoi oggetti, che puoi ricaricare in seguito.

Tuttavia, non memorizza lo stato JVM completo (stack di chiamate, stato GC ecc.). Se hai davvero bisogno di quel livello di dettaglio, potrebbe essere necessaria una JVM specializzata.

La risposta in questo momento è no , non ci sono JVM che possono 'ibernare' come il tuo sistema operativo può o come VMWare et al can.

potresti arrivare a metà strada, a seconda della complessità della tua app, semplicemente serializzando lo stato quando il programma si chiude e reinserendolo, ma ciò non farà cose come la pausa eseguendo alcune logiche aziendali quando chiudi e poi continua quando la riapri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top