Domanda

È possibile scaricare un'immagine di una JVM in esecuzione e successivamente ripristinare lo stato precedente caricando l'immagine nella JVM? Sono abbastanza sicuro che la risposta sia negativa, ma mi piacerebbe sbagliarmi.

Con tutte le lingue dinamiche disponibili per la JVM aumenta l'interattività, essere in grado di salvare una sessione di codifica aiuterebbe a risparmiare tempo ripristinando manualmente la VM in una sessione precedente.

È stato utile?

Soluzione

C'è stato un JSR 323 proposto per questo qualche tempo fa ma era rifiutato . Puoi trovare alcuni link in quegli articoli sulla ricerca dietro questo e cosa ci vorrebbe. È stato per lo più respinto come un'idea troppo immatura.

Ho sentito di almeno una startup (purtroppo non ricordo il nome) che stava lavorando su una tecnologia di virtualizzazione su un hypervisor (probabilmente Xen) che si stava avvicinando abbastanza alla possibilità di spostare le JVM, tra cui anche cose come riferimenti al file system e endpoint socket. Poiché erano a livello di hypervisor, avevano accesso a tutte quelle cose. Agganciando quello e la JVM, avevano la maggior parte dei pezzi. Penso che potrebbero essere andati sotto però.

La cosa più vicina che puoi ottenere oggi è Terracotta , che ti consente di raggruppare una parte del tuo heap JVM, memorizzandolo in un array di server, che può essere reso persistente. All'avvio di JVM, ti connetti al cluster e puoi continuare a utilizzare qualsiasi parte dell'heap specificata come cluster. Gli oggetti effettivi vengono inseriti in errore in base alle necessità.

Altri suggerimenti

Al momento non possibile. In generale, mettere in pausa e riavviare un'immagine di memoria di un processo in un contesto diverso è incredibilmente difficile da ottenere: che cosa hai intenzione di fare con le risorse del sistema operativo aperte? Trasferimenti su macchine con diversi set di istruzioni? connessioni al database?

Anche le immagini della JVM in esecuzione sono probabilmente piuttosto grandi - forse molto più grandi del sottoinsieme dello stato a cui sei effettivamente interessato. Quindi non è una buona idea dal punto di vista delle prestazioni.

Una strategia molto migliore è avere codice che persista e ricrea lo stato dell'applicazione : questo è relativamente fattibile con la maggior parte dei linguaggi dinamici JVM. Faccio cose simili in Clojure, dove hai un ambiente interattivo (REPL) ed è abbastanza possibile creare ed eseguire una sequenza di operazioni che ricostruiscono lo stato dell'applicazione che desideri in un'altra JVM.

Questo attualmente non è possibile in nessuna delle JVM che conosco. Non sarebbe molto difficile implementare qualcosa di simile nella JVM se i programmi fossero disconnessi dai loro ambienti. Tuttavia, molti programmi hanno hook nel loro ambiente (pensa a handle di file, connessioni al database) che renderebbero molto pelosa l'implementazione di qualcosa del genere.

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