2009-09-17 24 views
8

メインアプリケーションから別のJVM(java.exe)を実行しています。新しく作成されたプロセス(作成時または作成後)とオブジェクト(かなり大きなオブジェクト)を共有する方法はありますか。Javaプロセス間でオブジェクトを共有する

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

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

は今、私はオブジェクトがPROCオブジェクト

で示されるプロセスが利用できるようにしたいProcessBuilderを、この目的のために任意のユーティリティを提供していますか?

答えて

0

いいえJavaでは共有メモリのサポートはありません。

これに対処する最も簡単な方法は、オブジェクトを一時ファイルにシリアル化し、新しいJVMで逆シリアル化することです。

+0

(...ようにmemcachedをして、EHCacheなど)あなたは、この目的のために分散キャッシュを使用することができると思います。私は別のASTを出力するASTを前処理しなければなりません。これらを処理するために、コンパイラをもう一度呼び出す必要があります。別々に実行する代わりに、私はこのプロセスを簡素化したいと思います。現在、私は新しいプロセスで元のjavaプログラムを単純に再解析しています。私はシリアライズを試みましたが、多くのデータ構造を持つむしろ大きなオブジェクト(正確な完全なプログラム)を試しました。 – user174819

1

サービスを公開して、オブジェクトからのデータへのアクセスを許可することができます。 RMIを使用してプロセス間通信を設定するのは比較的簡単です。 IPCのオーバーヘッドが発生するため、ローカルアクセスほどパフォーマンスが悪く、細かいアクセスは高価になりますが、要約やその他のデータが集計されている場合は、まともなモデルになる可能性があります。

なぜこれらが別々のプロセスであるかはわかりません。子プロセスのコードを親プロセスに直接ロードする機会はありますか?動的な積み下ろしが可能です。

+0

子プロセスのコードを親プロセスに直接渡す方法を教えてください。また、私は子プロセスからのデータを取得したくないだけ親プロセスから子プロセスにデータを送信する? – user174819

+0

親 - >子、子 - >親、違いはありません、もう一方はそれを呼び出すサービスを提供します。しかし、私の主な質問は、なぜ彼らは別々のプロセスであるのかということでした。 1つの大きなプロセスがあり、スレッドは別の仕事をしています。ニーズに応じて、1つの大きなプログラムをリンクすることも、標準のJava APIを使用してクラスを動的にロードすることもできます – djna

+0

これはJVMアーキテクチャモデルの制限だと思うかもしれません。この機能を持たないサービス層を提供することは非常に困難になります。マッサージを渡すオペレーティングシステムでさえ、共有オブジェクトとサービスを使用します。 – will

3

オブジェクトを共有する場合は、別のプロセスではなくスレッドを使用するのが最善の方法です。プロセスはメモリを共有することはできません(JNIを除く)ので、大きなオブジェクトをファイルまたはRMIソケット接続を介してシリアル化された形式で前後にコピーする必要があります(後者は固有の同期をもたらすため、 。

+0

上記のコードのように別のJVM(java.exe)を起動するためにスレッドを使用できますか?私はいつもProcessが別のJVMを起動するのに使われているのを見てきました。 – user174819

+0

いいえ、別のJVMを起動できません。スレッドではなくプロセスになります。しかし、実際に別のJVMが必要ですか?新しいJVMを起動するmain()メソッドを代わりにスレッドで実行するだけでは問題ありませんか? –

0

私は、私は、コンパイラ(ジャワの拡張子)で働いています

関連する問題