Gibt es Java VMs, die ihren Zustand in einer Datei speichern und dann diesen Zustand neu zu laden?

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

Frage

Gibt es Java VMs, die ihren Zustand in eine Datei speichern und dann diesen Zustand neu zu laden?

Wenn ja, welche?

War es hilfreich?

Lösung

Eine weitere Option, die in Ihrem Fall möglicherweise nicht relevant sein, ist die JVM (jede JVM) in einer virtuellen Maschine laufen zu lassen. Die meisten virtuellen Maschinen bieten die Möglichkeit Zustand zu speichern und wieder aufnehmen, so dass Sie sollte die Lage, Ihren PC neu zu starten, die VM feuern, wenn es wieder nach oben kommt und haben den Java-Prozess abholen, von wo es war.

verwende ich VMWare Player zum Testen auf IE bei der Arbeit, und das funktioniert, wie oben erwähnt, wenn ich schließe und es später wieder öffnen. Ich im Allgemeinen nicht tue dies, wenn Anwendungen sind etwas von Note in der VM zu tun, aber solange sie keine externen Ressourcen zugreifen (zB Netzwerk-Sockets), würde ich erwarten, dass es so arbeiten, wenn die VM wurde nie geschlossen .

Andere Tipps

Fortsetzungen sind wahrscheinlich das, was Sie suchen:

  

[...] erste Klasse Fortsetzungen, die Konstrukte   dass gibt eine Programmiersprache, die   Fähigkeit, den Ausführungszustand zu speichern bei   jeder Punkt und zurück zu diesem Punkt an   eine spätere Stelle im Programm.

Es gibt mindestens zwei Fortsetzungs Bibliotheken für Java: RIFE Fortsetzungen und javaflow . Ich weiß, dass javaflow mindestens Serialisierung Zustand auf der Festplatte erlaubt:

  

kann A Continuation serialisiert werden, wenn   Alle Objekte, die es gefangen ist auch   serializable. Mit anderen Worten, die ganze   lokale Variablen (einschließlich aller this   Objekte) müssen als gekennzeichnet werden   Serializable. In diesem Beispiel möchten Sie   müssen die MyRunnable Klasse markieren als   Serializable. Eine serialisierte   Fortsetzung kann geschickt werden   eine andere Maschine oder später verwendet. - Javaflow Tutorial

Sie sollten relevante domänenspezifische Objekte serialisiert werden, die von einer anderen JVM-Laufzeit deserialisiert werden kann.

Ich bin mir nicht bewusst werkzeuglos eine ganze JVM persistierenden. Die nächstgelegene ich bekam zu tun dies ein Core-Dump aus einem laufenden JVM-Verfahren wurde die Erstellung gcore , dann mit jsadebugd , jmap oder jstack es zu debuggen.

Zum Beispiel:

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

UPDATE

Ich glaube nicht, dass du gehst, eine Lösung zu finden, die nur noch zwischen Architekturen tragbar ist.

Es ist erwähnenswert, dass viele Objekte können nicht als sie Zustand außerhalb des Java-Kontext haben serialisiert werden. z.B. Sockets, Themen, Öffnen von Dateien, Datenbankverbindungen. Aus diesem Grunde ist es schwierig, den Zustand einer nützlichen Anwendung in allgemeiner Weise zu speichern.

Ich bin mir nicht bewusst, JVM, den Zustand speichern kann. Je nach Ihren genauen Bedürfnissen, können Sie vielleicht mit Terracotta betrachten. Terracotta ist im Wesentlichen der Lage Heap Zustand zwischen JVM zu teilen, und diesem Zustand auf der Festplatte.

Dies kann dazu verwendet werden, um Anwendungen auf Cluster, und / oder die heapstate persistent zu machen. In der Tat, können Sie es verwenden, um die JVM und abholen zu beginnen, wo Sie aufgehört haben. Weitere Informationen finden Sie unter: http://www.infoq.com/articles/open-terracotta-intro

Hope, das hilft.

Ich habe gearbeitet ein eingebettetes Java-Projekt , die verwendet dieser Ansatz schnell zu starten. Die JVM war von Wind River, oben auf VxWorks läuft.

Sun hat einige der Forschung über „orthogonale Persistenz“ getan, die „Beharrlichkeit für die volle Rechenmodell, das de fi nedby der Programmiersprache Java Spezifikation ist“ sieht vor:

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

PJama ist ein Prototyp-Implementierung:

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

Mein Wissen gibt es nichts JVM Zustand zu erfassen und wiederherstellen, aber die Leute versuchen, die Klasse Thread zu serialisiert / deserialisiert etwas ähnliches zu erreichen. Die nächste Sache, eine funktionierende Implementierung ich fand, war Bremsen , aber Sie können mehr finden, wenn Sie für „Thread-Serialisierung“ google.

Ich nehme an, Sie wieder aufnehmen können, wollen, wo der Schnappschuss gespeichert wurde, als ob nichts danach geschehen war.

Ich frage mich, wie viele Framework-Komponenten und Bibliotheken eine solche Funktionalität würde brechen. Plötzlich sind Sie einen JVM Zustand aus dem Speicher wiederbelebt; In der Zwischenzeit hat sich die Uhr von 23 Stunden übersprungen vorwärts auf mysteriöse Weise, Netzwerkverbindungen sind nicht mehr gültig, Objekte GUI nicht mehr irgendwelche zugrunde liegenden O / S Griffe ... Ich würde sagen, das ist nicht trivial, und unmöglich, im allgemeinen Fall ohne Modifizieren umfassend den Rahmen.

Wenn Sie weg mit nur den Zustand Ihrer Objekte im Speicher zu speichern, dann so etwas wie Prevaylor könnte für Sie arbeiten. Es verwendet eine Kombination von Änderungen an Business-Objekten mit einem serialisierten Snapshot Journaling den Zustand Ihrer Objekte aufzunehmen, die Sie dann später wieder geladen werden.

Es ist jedoch nicht speichert den vollen JVM Zustand (Call-Stack, GC-Status usw.). Wenn Sie wirklich, dass der Detaillierungsgrad benötigen, dann eine spezialisierte JVM erforderlich sein könnte.

Die Antwort zu dieser Zeit ist nicht , es gibt keine JVMs, die wie Ihr Betriebssystem ‚überwintern‘ kann kann oder wie VMWare et al kann.

Sie könnte bekommen es auf halbem Weg, die Komplexität Ihrer Anwendung abhängig, nur um Zustand heraus Serialisierung, wenn das Programm geschlossen und wieder in die Serialisierung, aber das wird nicht Sachen wie Pause machen einige Geschäftslogik auszuführen, wenn Sie schließen und dann weiter, wenn Sie es wieder öffnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top