Existe-t-il des machines virtuelles Java pouvant enregistrer leur état dans un fichier, puis recharger cet état?

StackOverflow https://stackoverflow.com/questions/424341

Question

Existe-t-il des machines virtuelles Java pouvant enregistrer leur état dans un fichier, puis recharger cet état?

Si oui, lesquels?

Était-ce utile?

La solution

Une autre option, qui peut être pertinente ou non dans votre cas, consiste à exécuter la machine virtuelle Java (n'importe quelle machine virtuelle) dans une machine virtuelle. La plupart des machines virtuelles offrent la possibilité de stocker et de reprendre l’état. Ainsi, vous devriez pouvoir redémarrer votre ordinateur, allumer la machine virtuelle lorsqu’elle se rétablit et laisser le processus Java reprendre à l’origine.

J'utilise VMWare Player pour tester Internet Explorer au travail, et cela fonctionne comme indiqué ci-dessus lorsque je le ferme et que je le rouvre plus tard. Je ne fais généralement pas cela lorsque des applications font quelque chose de notable dans la VM, mais tant qu'elles n'accèdent pas à des ressources externes (par exemple, des sockets réseau), je m'attendrais à ce que cela fonctionne comme si la VM n'était jamais arrêtée. .

Autres conseils

Les continuations sont probablement ce que vous recherchez:

  

[...] suites de première classe, qui sont des constructions   qui donnent un langage de programmation le   possibilité de sauvegarder l'état d'exécution à   tout point et revenir à ce point à   un point ultérieur du programme.

Il existe au moins deux bibliothèques de continuation pour Java: continuations RIFE et javaflow . Je sais que javaflow permet au moins de sérialiser l’état sur le disque:

  

Un Continuation peut être sérialisé si   tous les objets capturés sont également   sérialisable. En d'autres termes, tous les   variables locales (y compris tous les ce   objets) doivent être marqués comme    Sérialisable . Dans cet exemple, vous   besoin de marquer la classe MyRunnable comme   Sérialisable. Une série   la suite peut être envoyée à   une autre machine ou utilisé plus tard. - Didacticiel Javaflow

Vous devez sérialiser les objets spécifiques au domaine pertinents qui peuvent être désérialisés par une autre exécution JVM.

Je ne suis au courant d'aucun outil permettant de conserver une machine virtuelle entière. Ce qui me tenait le plus à faire, c’était la création d’un core dump à partir d’un processus JVM en cours d’exécution en utilisant gcore , puis utilisez jsadebugd , jmap ou jstack pour le déboguer.

Par exemple:

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

MISE À JOUR

Je ne pense pas que vous allez trouver une solution portable entre les architectures pour l'instant.

Il est à noter que de nombreux objets ne peuvent pas être sérialisés car ils ont un état en dehors du contexte java. par exemple. Sockets, Threads, fichiers ouverts, connexions à la base de données. Pour cette raison, il est difficile de sauvegarder de manière générique l'état d'une application utile.

Je ne suis pas au courant de l'existence de machines virtuelles pouvant stocker l'état. En fonction de vos besoins, vous pouvez peut-être envisager d’utiliser Terracotta. Terracotta est essentiellement capable de partager l’état de tas entre les machines virtuelles et de le stocker sur un disque.

Ceci peut être utilisé pour mettre en cluster des applications et / ou rendre le tas hérissé. En fait, vous pouvez l’utiliser pour démarrer la JVM et reprendre là où vous l’avez laissée. Pour plus d'informations, consultez: http://www.infoq.com/articles/open-terracotta-intro

J'espère que cela vous aidera.

J'ai travaillé sur un projet Java intégré qui utilisait cette approche pour démarrer rapidement. La machine virtuelle Java venait de Wind River et s'exécutait au dessus de VxWorks.

Sun a effectué des recherches sur la "persistance orthogonale", qui fournit la "persistance du modèle de calcul complet défini par la spécification du langage Java":

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

PJama est une implémentation prototype:

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

À ma connaissance, rien ne permet de capturer et de restaurer l'état de la machine virtuelle Java, mais des personnes tentent de sérialiser / désérialiser la classe Thread pour obtenir un résultat similaire. La chose la plus proche d’une mise en œuvre opérationnelle que j’ai trouvée était freins . , mais vous pouvez en trouver davantage lorsque vous recherchez une "sérialisation de thread" sur Google.

Je suppose que vous voulez pouvoir reprendre à partir de l'endroit où l'instantané a été stocké, comme si rien ne s'était passé par la suite.

Je me demande combien de composants de framework et de librairies une telle fonctionnalité casserait. Soudain, vous réactivez un état JVM à partir du stockage. pendant ce temps, l'horloge a mystérieusement été avancée de 23 heures, les connexions réseau ne sont plus valides, les objets GUI n'ont plus de poignées O / S sous-jacentes ... Je dirais que c'est non trivial, et impossible dans le cas général sans modifier considérablement le cadre.

Si vous pouvez vous contenter de stocker l'état de vos objets en mémoire, choisissez Prevaylor . pourrait travailler pour vous. Il utilise une combinaison de modifications de journalisation dans des objets métier avec un instantané sérialisé pour enregistrer l'état de vos objets, que vous pourrez ensuite recharger ultérieurement.

Cependant, il ne stocke pas l'état complet de la JVM (pile d'appels, statut du GC, etc.). Si vous avez vraiment besoin de ce niveau de détail, vous aurez peut-être besoin d'une JVM spécialisée.

À l'heure actuelle, la réponse est non , aucune machine virtuelle Java ne peut "hiberner" comme votre système d'exploitation ou VMWare et al.

.

Vous pourriez arriver à mi-chemin, en fonction de la complexité de votre application, en sérialisant simplement l'état à la fermeture du programme et en le rediffusant, mais cela ne fera pas des choses comme une pause exécuter une logique métier lorsque vous fermez puis continuez lorsque vous l'ouvrez à nouveau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top