2010-01-25 7 views
12

Ich habe einen Java-Prozess derzeit unter einer Windows-Shell ausgeführt.führen Sie neuen Java-Code in vorhandenen jvm-Prozess

Einer der für die Serialisierung verantwortlichen Threads ist auf unbestimmte Zeit gesperrt, und wichtige Informationen, die im Speicher gespeichert sind, werden nicht mehr auf die Festplatte geschrieben.

Wenn ich den Prozess heruntergefahren habe, gehen die Informationen verloren.

Es wäre praktisch, wenn ich etwas neuen Code schreiben und kompilieren könnte und ihn im selben Speicher ausführen lassen würde, damit die besagten Informationen noch einmal serialisiert werden könnten, bevor ich den Prozess herunterfahre.

Der Prozess wurde mit einem Befehl java -jar gestartet.

Mit den Hotspot VM-Funktionen, gibt es eine Möglichkeit, dies zu erreichen?

+0

Können Sie einen Debugger an den Prozess anhängen? Wenn dies der Fall ist, können Sie möglicherweise den Code zum Speichern der Daten auslösen. – jdigital

+0

Ich habe Btrace in der Vergangenheit in einer etwas ähnlichen Situation verwendet. http://kenai.com/projects/btrace/pages/Home –

+0

Sie sollten sagen, welche Version der JVM Sie verwenden. –

Antwort

12

Sie können die Datei Attach API zum Anhängen an eine virtuelle Maschine verwenden. Here's an article that explains how to use it

Hier ist ein Codebeispiel:

String agentJAR = "myAgent.jar"; 
VirtualMachine vm = VirtualMachine.attach (processid); 
vm.loadAgent(agentJAR); 

Wenn das Mittel der Name Ihres Glas ist.

Der Agent-Jar enthält einen Agent, der über die Instrumentation-API mit der JVM verbunden werden kann.

einen Agenten erstellen, die zur Laufzeit geladen wird, erhalten Sie eine agentmain Funktion wie folgt implementieren:

public static void agentmain(String agentArgs, Instrumentation inst); 

oder

public static void agentmain(String agentArgs); 

Das Instrumentation Objekt wird zur Laufzeit verwendet ändern Klassen, die Sie wahrscheinlich nicht nötig. Aber hoffentlich können Sie einfach den Code, den Sie benötigen, in agentmain ausführen und dann die attach-API verwenden, um sie in der Ziel-JVM auszuführen.

Viel Glück !!

+0

danke, das ist wahrscheinlich die beste Wette, aber ich bezweifle, dass ich in der Lage sein werde, zu tun, was ich will - das ist jemand Griff auf ein Objekt-Feld (die keine statische Referenz hat) und serialisieren es. Ich werde mein Bestes geben (am schlimmsten) obwohl! – pstanton

+0

tatsächlich * konnte * ich mein Problem lösen, indem ich eine Ausnahme auf einen bestimmten Thread warf.Dieser Thread wird momentan unbegrenzt an einen Socket gehängt. Ich weiß, wie man den Thread in den Griff bekommt und muss entweder eine Ausnahme auslösen oder ich kann ihn beenden und neu starten. werde versuchen. Danke. – pstanton

+0

Sie könnten versuchen, es zu unterbrechen. –

Verwandte Themen