2009-01-08 2 views

Antwort

10

Eine andere Option, die in Ihrem Fall relevant sein kann oder nicht, besteht darin, die JVM (beliebige JVM) in einer virtuellen Maschine auszuführen. Die meisten virtuellen Maschinen bieten die Möglichkeit, den Status zu speichern und wieder aufzunehmen, so dass Sie in der Lage sein sollten, Ihren PC neu zu starten, die VM hochzufahren, wenn sie wieder hochfährt, und den Java-Prozess von dort abholen zu lassen.

Ich verwende VMWare Player zum Testen auf IE bei der Arbeit, und das funktioniert wie oben erwähnt, wenn ich schließe und später wieder öffnen. Ich mache das normalerweise nicht, wenn Apps in der VM etwas bemerkenswertes tun, aber solange sie nicht auf externe Ressourcen zugreifen (z. B. Netzwerk-Sockets), würde ich erwarten, dass es so funktioniert, als wäre die VM niemals heruntergefahren worden .

4

Sie sollten relevante domänenspezifische Objekte serialisieren, die durch eine andere JVM-Laufzeit deserialisiert werden können.

Mir sind keine Werkzeuge bekannt, die eine ganze JVM beibehalten. Am nächsten kam das Erstellen eines Core-Dumps aus einem laufenden JVM-Prozess unter Verwendung von gcore, dann jsadebugd, jmap oder jstack, um 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 Sie eine Lösung finden werden, die nur noch zwischen Architekturen tragbar ist.

2

Nach meinem Wissen gibt es nichts, um den JVM-Status zu erfassen und wiederherzustellen, aber die Leute versuchen, die Thread-Klasse zu serialisieren/deserialisieren, um etwas Ähnliches zu erreichen. Das Ergebnis einer funktionierenden Implementierung, die ich gefunden habe, war brakes, aber Sie können mehr finden, wenn Sie nach "thread serialization" googlen.

4

Es ist erwähnenswert, dass viele Objekte nicht serialisiert werden können, da sie außerhalb des Java-Kontexts liegen. z.B. Sockets, Threads, offene Dateien, Datenbankverbindungen. Aus diesem Grund ist es schwierig, den Status einer nützlichen Anwendung in generischer Form zu speichern.

1

Wenn Sie mit nur speichert den Zustand Ihrer Objekte im Speicher, dann so etwas wie Prevaylor Macht weg Arbeite für dich. Es verwendet eine Kombination von Journaling-Änderungen an Geschäftsobjekten mit einem serialisierten Snapshot, um den Status Ihrer Objekte aufzuzeichnen, die Sie später erneut laden können.

Es speichert jedoch nicht den vollständigen JVM-Status (Aufrufliste, GC-Status usw.). Wenn Sie diese Detailgenauigkeit wirklich benötigen, ist möglicherweise eine spezielle JVM erforderlich.

4

Ich bin mir nicht bewusst, dass JVMs Status speichern können. Abhängig von Ihren genauen Bedürfnissen können Sie Terrakotta verwenden. Terracotta ist im Wesentlichen in der Lage, den Heap-Status zwischen JVMs zu teilen und diesen Zustand auf der Festplatte zu speichern.

Dies kann verwendet werden, um Anwendungen zu clustern und/oder den Heapstatus persistent zu machen. In der Tat können Sie damit die JVM starten und dort weitermachen, wo Sie aufgehört haben. Weitere Informationen finden Sie unter: http://www.infoq.com/articles/open-terracotta-intro

Ich hoffe, dies hilft.

4

Continuations sind wahrscheinlich das, was Sie suchen:

[...] erste Klasse Fortsetzungen, die Konstrukte sind, die eine Programmiersprache, die Fähigkeit geben den Ausführungszustand bei jeder Punkt zu retten und zu diesem Punkt bei einen späteren Punkt im Programm zurückkehren.

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

A Continuation kann serialisiert werden, wenn alle Objekte, die es auch gefangen ist serializable. Mit anderen Worten, alle lokalen Variablen (einschließlich aller this Objekte) müssen als Serializable markiert werden. In diesem Beispiel müssen Sie die MyRunnable-Klasse als Serializable markieren. Eine fortlaufende Nummer kann an eine andere Maschine gesendet oder später verwendet werden. - Javaflow Tutorial

+0

Dalma (https://dalma.dev.java.net/) hat offensichtlich auch Fortsetzungen. –

+0

Continuations sind cool und alle, aber arbeiten nur innerhalb eines laufenden Prozesses, um ein Stück Arbeit für später zu speichern, während Sie fortfahren, andere Sachen zu tun. Die Frage scheint darin zu bestehen, das Programm und JVM auf einen früheren Zustand zurückzusetzen (möglicherweise mit einem dazwischen liegenden Herunterfahren). –

+0

@Pontus Gagge: Sie haben das zweite Zitat nicht gelesen. javaflow-Fortsetzungen serialisieren den Stack und alles. Sie können später von der Festplatte wieder geladen werden. Sogar auf einer anderen Maschine. – waqas

2

Ich nehme an, Sie möchten in der Lage sein, von wo der Schnappschuss gespeichert wurde, als ob nichts danach passiert wäre.

Ich frage mich, wie viele Framework-Komponenten und Bibliotheken solche Funktionalität würde brechen. Plötzlich beleben Sie einen JVM-Zustand aus dem Speicher. In der Zwischenzeit ist die Uhr auf mysteriöse Weise um 23 Stunden nach vorne gesprungen, Netzwerkverbindungen sind nicht mehr gültig, GUI-Objekte haben keine zugrunde liegenden O/S-Handles mehr ... Ich würde sagen, dies ist nicht trivial und im allgemeinen Fall ohne das Framework umfangreich modifizieren.

+0

Dies sind die gleichen Probleme, die auftreten, wenn Ihr Betriebssystem sich im Ruhezustand befindet oder ein VM-Server eine VM pausiert. Vermutlich werden sie genauso gehandhabt oder genauer behandelt. – SCdF

+0

... mit dem Unterschied, dass die O/S- und Treiberstacks tatsächlich über den Ruhezustand Bescheid wissen und die Dinge entsprechend packen/entpacken können. Hier wird ein Prozess, der die JVM enthält, einfach amnestisch und erwartet, dass alles funktioniert ... –

+0

Genau das passiert, wenn ich meinen Laptopdeckel schließe - Der Computer geht schlafen. Ich öffne den Laptopdeckel und die Apps gehen dort weiter, wo sie aufgehört haben. Ja, wenn ich zu dem Zeitpunkt, zu dem ich den Deckel schließe, eine Steckdose geöffnet habe, ist die Steckdose geschlossen. Die VM sollte nicht anders sein. – jdkoftinoff

1

Die Antwort zu dieser Zeit ist keine, es gibt keine JVMs, die wie Ihr Betriebssystem "überwintern" können oder wie VMWare et al können.

Sie könnte halb dort, je nach der Komplexität Ihrer App, durch nur Serialisierung Zustand, wenn das Programm schließt und serialisieren es zurück, aber das wird nicht tun wie pause Ausführen einiger Geschäftslogik wenn Sie schließen und dann weitermachen, wenn Sie es wieder öffnen.

Verwandte Themen