JVM Erzeugung und Reset

Gibt es eine Möglichkeit um aus einem Programm heraus neue JVM zu erzeugen oder eine vorhandene neuzustarten?

ich stelle mir das so vor:

MyNewJVM jvm = new MyNewJVM();
jvm.start() //starte die neue JVM
jvm.reset() //neustart der JVM

alle Möglichkeiten die ich gefunden habe, basieren auf einen Shell-Aufruf des Betriebssystems in der Art

java -cp......

Hallo,

dein Problem ist etwas knapp beschrieben und daher kann ich dir nicht versprechen, dass ich genau dein Problem lösen kann.

Sicher ist auf jedenfall, dass du mit der Problemlösung den Java Grundsatz „Write once, run anywhere“ (WORA) verletzt => ist aber möglich:

Aus Java kannst du natürliche neue Prozesse starten ->

Runtime r = Runtime.getRuntime();
Process p = r.exec(„java -jar dateiname“)

-> mit trry & catch noch die Exeptions abfangen :wink:

Ein Neustart der VM is ebenfalls möglich über einen Shutdownhook (Funktioniert jedoch nicht, wenn bei Windows die VM über den Taskmanager beendet wird)

Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println(„Die VM wird gerade beendet!“);
}
});

Anstatt „Die VM wird gerade beendet!“ einfach aktuellen VM-Stand serialisieren und VM mit serialisierten Objekten neustarten => macht da weiter wo es aufgehört hat.

Viele Grüße

Sebastian_

Sicher ist auf jedenfall, dass du mit der Problemlösung den
Java Grundsatz „Write once, run anywhere“ (WORA) verletzt =>
ist aber möglich:

Was meinst du damit genau? Ist es wegen den plattformspezifischen Einstellungen? (Windows=> Batch, Linux => Sh, usw.). Bei kleveren Aufbau ist dieser Ansatz fast 100% generisch, so das man ihm ein „plattform übergreifende“ Eigenschaft zu sprechen könnte.

Runtime r = Runtime.getRuntime();
Process p = r.exec(„java -jar dateiname“)

Das ist ja was ich eigentlich nicht haben wollte…Es hätte ja sein können das es ein Gegenstück zu System.exit() gibt in der Art wie System.restart() oder so?!?

Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println(„Die VM wird gerade beendet!“);
}
});

Cooler Tipp kannte ich noch garnicht. Das mit den Hooks werde ich mal checken.

Ich habe schon etwas gefunden zum Thema Reset, aber bei dieser Lösung handelt es sich um eine proprietär Lösung/Addon für die JVM und wird nur in Rahmen eines Support- und Kaufvertrages bei IBM angeboten…Bei diesen Produkt handelt es sich zum einen um IBM-spezifisches Zeug und zum zweiten kostet ordentlich Kohle, da ich mehr erwerben muss als ich will (IBM Mildeware-Stack mit Webphere und co.)

Hi,

Bezüglich WORA ->

Nicht alles funktiniert unter jedem Betriebssystem gleich. Der Aufruf eines Programms mit Java unterscheidet sich beispielsweise bei Linux, Windows und Mac schon alleine bei der Eingabe des Pfades und den Orten wo die Programme gespeichert werden. Nicht jede VM hat die gleichen Standardbefehle implementiert und bei Shutdownhooks ist wie bereits beschrieben der Abruch mittels Taskmanager möglich, ohne das „SIGINT“ ausgelöst wird und abgefangen werden kann. Linux und Co geben das immer aus. Sicherlich sind das alles nur Kleinigkeiten, können aber je nachdem was du vorhast wichtig sein.

Das Problem eines Restarts der VM ist leider nicht so einfach möglich. Hier gibt es (ich spreche von der VM von Sun/oracle) leider (meines Wissens nach) die Möglichkeit einer Serialisierung vor beenden der VM und Einlesen des Zustandes bei Neustart. Hier bieten sich Sierialisierungsbibliotheken an, damit man das nicht alles selber schreiben muss :wink:

Die Lösung von IBM beruht wahrscheinlich auf Smalltalk. Eine Java-VM in Smalltalk kann Ihren Zustand speichern und wieder abrufen. Meines Wissens ist aber diese Smalltalk-Java-VM nicht mehr uptodate.

Viele Grüße

Sebastian_