2009-09-17 12 views
8

Sto eseguendo un'altra JVM (java.exe) dall'applicazione principale. C'è un modo per condividere un oggetto (piuttosto grande oggetto) con il processo appena creato (al momento della creazione o dopo che è stato creato).Condivisione di oggetti su processi Java

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

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

Ora voglio l'oggetto in modo da essere a disposizione del processo indicato con l'oggetto proc

fa ProcessBuilder fornisce alcuna utilità per questo scopo?

risposta

0

No, non è disponibile il supporto per la memoria condivisa in Java.

Il modo più semplice per risolvere questo problema è serializzare l'oggetto in un file temporaneo e quindi deserializzare di nuovo nella nuova JVM.

+0

Sto lavorando con un compilatore (un'estensione di Java). Devo pre-elaborare l'AST che emette diversi AST. Per poterli elaborare devo chiamare di nuovo il compilatore. Invece di eseguirli separatamente, voglio semplificare questo processo. Al momento, sto semplicemente ri-analizzando il programma java originale nel nuovo processo. Ho provato la serializzazione ma è piuttosto un oggetto di grandi dimensioni (un programma completo per la precisione) con molte strutture di dati. – user174819

1

È possibile esporre un servizio per consentire l'accesso ai dati dall'oggetto. È relativamente semplice impostare la comunicazione tra processi utilizzando RMI. Ci sarà un overhead IPC quindi questo non sarà performante come l'accesso locale, l'accesso a grana fine diventerà costoso, ma se stai ricevendo un sommario o altri dati aggregati, questo potrebbe essere un modello decente.

Non si dice perché si tratta di processi separati. Hai qualche possibilità di caricare il codice del tuo processo figlio direttamente nel genitore? È possibile caricare e scaricare dinamicamente.

+0

Come faccio a 'ricondurre il codice del processo figlio direttamente al genitore'. Inoltre, non desidero ottenere dati dal processo figlio per inviare solo dati dal processo padre al processo figlio? – user174819

+0

Genitore-> figlio, figlio-> genitore, non fa differenza, uno fornisce il servizio che l'altro chiama. Ma la mia domanda principale era perché si trattava di processi separati? Basta avere un unico grande processo, con thread che svolgono diversi lavori. A seconda delle esigenze, è sufficiente collegare un grande programma o caricare le classi in modo dinamico utilizzando le API Java standard – djna

+0

Si potrebbe pensare che si tratti di una limitazione del modello di architettura JVM. Diventa piuttosto difficile consegnare livelli di servizio privi di questa funzione. Perfino il massaggio che passa i sistemi operativi utilizzerà oggetti e servizi condivisi. – will

3

Se si desidera condividere oggetti, il modo migliore è utilizzare thread invece di un processo separato. I processi non possono condividere la memoria (tranne attraverso JNI), quindi dovresti copiare l'oggetto di grandi dimensioni avanti e indietro in forma serializzata, tramite file o tramite connessione socket RMI (quest'ultima opzione è l'opzione migliore poiché risulta nella sincronizzazione intrinseca) .

+0

È possibile utilizzare un thread per avviare un'altra JVM (java.exe) come il codice mostrato sopra? Ho sempre visto Process in uso per avviare un'altra JVM. – user174819

+0

No, non è possibile avviare un'altra JVM, quindi sarebbe un processo, non un thread. Ma hai davvero bisogno di un'altra JVM? Non puoi semplicemente eseguire il metodo main() in cui avresti avviato la nuova JVM in una discussione? –

0

Sono che si possa utilizzare le cache distribuita per questo scopo (EHCache, memcached e così via ...)

Problemi correlati