2009-09-17 14 views
8

Ich führe eine andere JVM (java.exe) aus der Hauptanwendung aus. Gibt es eine Möglichkeit, ein Objekt (ziemlich großes Objekt) mit dem neu erstellten Prozess (zum Zeitpunkt der Erstellung oder nach der Erstellung) zu teilen.Gemeinsame Nutzung von Objekten in Java-Prozessen

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

Runtime rt = Runtime.getRuntime(); 
Process proc = rt.exec("java -cp " + tempDir + jarsInPath + " " + appMain); 

Jetzt möchte ich das sO Objekt auf den Prozess durch das proc Objekt

Does Process bieten alle Dienstprogramme für diesen Zweck bezeichnet verfügbar sein?

Antwort

0

Nein, in Java gibt es keine gemeinsame Speicherunterstützung.

Der einfachste Weg, dies anzugehen, wäre, das Objekt in eine temporäre Datei zu serialisieren und es dann wieder in der neuen JVM zu deserialisieren.

+0

ich mit einem Compiler (eine Erweiterung von Java) arbeitete. Ich muss den AST vorverarbeiten, der verschiedene ASTs ausgibt. Um diese zu verarbeiten, muss ich den Compiler erneut aufrufen. Anstatt sie getrennt auszuführen, möchte ich diesen Prozess rationalisieren. Derzeit analysiere ich einfach das ursprüngliche Java-Programm im neuen Prozess. Ich habe versucht Serialisierung, aber es ist eher ein großes Objekt (ein komplettes Programm um genau zu sein) mit vielen Datenstrukturen. – user174819

1

Sie können einen Dienst verfügbar machen, um auf die Daten des Objekts zugreifen zu können. Es ist vergleichsweise einfach, die Kommunikation zwischen Prozessen mithilfe von RMI einzurichten. Es wird einen IPC Overhead geben, so dass dies nicht so performant wie lokaler Zugriff sein wird, feinkörniger Zugriff wird teuer werden, aber wenn Sie eine Zusammenfassung oder andere aggregierte Daten erhalten, dann könnte dies ein anständiges Modell sein.

Sie sagen nicht, warum diese separaten Prozesse sind. Haben Sie die Möglichkeit, den Code Ihres Kindprozesses direkt in den übergeordneten Prozess zu laden? Dynamisches Be- und Entladen ist möglich.

+0

Wie leite ich den Code Ihres Kindprozesses direkt in den Elternprozess ein. Auch möchte ich nicht Daten vom Kindprozess erhalten nur Daten vom Elternprozess zum Kindprozess senden? – user174819

+0

Eltern-> Kind, Kind-> Eltern, macht keinen Unterschied, man stellt den Dienst zur Verfügung, den der andere anruft. Aber meine primäre Frage war, warum sie überhaupt getrennte Prozesse sind? Haben Sie nur einen großen Prozess, bei dem Threads unterschiedliche Aufgaben erledigen. Abhängig von Ihren Bedürfnissen können Sie einfach ein großes Programm verknüpfen oder Klassen dynamisch mit Standard-Java-APIs laden. – djna

+0

Man könnte meinen, dies sei eine Einschränkung des JVM-Architekturmodells. Es wird ziemlich schwierig, Service-Layer bereitzustellen, die diese Möglichkeit nicht haben. Sogar Massage-Weitergabe-Betriebssysteme werden gemeinsame Objekte und Dienste verwenden. – will

3

Wenn Sie Objekte freigeben möchten, verwenden Sie am besten Threads anstelle eines separaten Prozesses. Prozesse können Speicher nicht gemeinsam nutzen (außer über JNI), so dass Sie das große Objekt in serialisierter Form entweder über Dateien oder über eine RMI-Socket-Verbindung hin und her kopieren müssen (wobei letzteres die bessere Option ist, da es zu einer inhärenten Synchronisation führt) .

+0

Kann ein Thread verwendet werden, um eine andere JVM (java.exe) wie den oben gezeigten Code zu starten? Ich habe immer gesehen, dass Process verwendet wird, um eine andere JVM zu starten. – user174819

+0

Nein, Sie können keine andere JVM starten - dann wäre es ein Prozess, kein Thread. Aber brauchst du eigentlich eine andere JVM? Können Sie nicht einfach die main() -Methode ausführen, mit der Sie die neue JVM stattdessen in einem Thread starten würden? –

0

Ich bin denken Sie verteilten Caches für diese Zwecke verwendet werden können (EHCache, Memcached und so weiter ...)

Verwandte Themen