2009-09-17 16 views
8

J'exécute une autre JVM (java.exe) à partir de l'application principale. Est-il possible de partager un objet (plutôt gros objet) avec le processus nouvellement créé (au moment de la création ou après sa création).Partage d'objets sur des processus Java

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

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

Maintenant, je veux l'objet d'être ainsi disponible pour le processus désigné par l'objet proc

Est-ce que ProcessBuilder fournir des services publics à cet effet?

Répondre

0

Il n'y a pas de support de mémoire partagée en Java.

La manière la plus simple de résoudre ce problème consiste à sérialiser l'objet dans un fichier temporaire, puis de le désérialiser dans la nouvelle machine virtuelle Java.

+0

Je travaille avec un compilateur (une extension de Java). Je dois pré-traiter l'AST qui produit différentes AST. Pour les traiter, je dois rappeler le compilateur. Au lieu de les exécuter séparément, je veux rationaliser ce processus. Actuellement, je suis simplement en train de ré-analyser le programme Java original dans le nouveau processus. J'ai essayé de sérialiser mais c'est plutôt un grand objet (un programme complet pour être précis) avec de nombreuses structures de données. – user174819

1

Vous pouvez exposer un service pour autoriser l'accès aux données de l'objet. Il est relativement simple de configurer une communication inter-processus en utilisant RMI. Il y aura une surcharge IPC donc ce ne sera pas aussi performant que l'accès local, l'accès fin sera coûteux, mais si vous obtenez un résumé ou d'autres données agrégées, cela pourrait être un modèle décent.

Vous ne dites pas pourquoi il s'agit de processus distincts. Avez-vous la possibilité de charger le code de votre processus enfant directement dans le parent? Le chargement et le déchargement dynamiques sont possibles.

+0

Comment puis-je gérer le code de votre enfant directement dans le parent? Aussi, je ne veux pas obtenir des données du processus enfant seulement envoyer des données du processus parent au processus enfant? – user174819

+0

Parent-> enfant, enfant-> parent, ne fait aucune différence, l'un fournit le service que l'autre l'appelle. Mais ma question principale était pourquoi ils sont des processus séparés du tout? Juste un grand processus, avec des threads faisant des tâches différentes. En fonction de vos besoins, vous pouvez simplement lier un gros programme ou charger dynamiquement des classes à l'aide d'API Java standard. – djna

+0

On pourrait penser qu'il s'agit d'une limitation du modèle d'architecture JVM. Il devient assez difficile de fournir des couches de services sans cette installation. Même le massage qui passe les systèmes d'exploitation utilisera des objets et des services partagés. – will

3

Si vous souhaitez partager des objets, le meilleur moyen est d'utiliser des threads au lieu d'un processus séparé. Les processus ne peuvent pas partager la mémoire (sauf via JNI), vous devez donc copier l'objet large sous forme sérialisée, soit via des fichiers, soit via une connexion socket RMI (cette dernière option étant la meilleure car elle entraîne une synchronisation inhérente) .

+0

Est-ce qu'un thread peut être utilisé pour démarrer une autre JVM (java.exe) comme le code ci-dessus? J'ai toujours vu Process utilisé pour démarrer une autre JVM. – user174819

+0

Non, vous ne pouvez pas démarrer une autre JVM - alors ce serait un processus, pas un thread. Mais avez-vous réellement besoin d'une autre JVM? Ne pouvez-vous pas simplement exécuter la méthode main() avec laquelle vous lanceriez la nouvelle JVM dans un thread? –

0

Je suis pense que vous pouvez utiliser les caches distribués pour cette fins (EHCache, memcached et ainsi de suite ...)