2011-12-07 7 views
3

コマンドラインから特定のプロセスを直接開始すると、2-3秒で完全に起動します。Java process.startは、親プロセスが起動しても破壊されない場合、非常に遅くなります

Javaプログラムからまったく同じコマンドで全く同じプロセスを開始すると、親プロセスが破棄されない限り、起動時にハングアップします。どうして? ProcessBuilderをして​​

:Runtime.execので

ProcessBuilder pb = new ProcessBuilder(cmd); 
pb.directory(new File(dir)); 
Process p = pb.start(); 

Runtime.getRuntime().exec(cmd, null, new File(dir)); 

私は、すぐにガベージコレクタをゼロにして呼び出すために新しいプロセスを新しいプロセスオブジェクトを設定しない場合はいずれかの方法3秒以内にやるべきことと同じことをするのに3分かかります。

Process p = pb.start(); 
p = null; 
Runtime.getRuntime().gc(); 

上記のコードを使用して問題を解決します。誰かがなぜ私を説明することはできますか?私はそれがJVMにプロセスの処理に関連するものだと思いますが、それは単なる推測です。

新しいプロセスは、Hibernateを使用してMySQL DBに接続し、log4jでログファイルを書き込み、.propertiesファイルから読み取り、RabbitMQサーバーに接続します。

は、Javaアプリケーションから外部プログラムを実行すると、権利を取得するために悪名高いトリッキーです

答えて

1

良い一日を、ありがとうございます。

高品質のApache Commons Exec libraryを使用することをおすすめします。

コードに依存関係を追加しないようにするには、少なくともExec library's Java codeを参照してプロセスの作成方法と実行方法を確認してください。

+1

ありがとうございますが、私は代替案を探しているわけではありません。なぜそれが起こるのか不思議です。 – grog

0

あなたの子プロセスにstdinからの入力が必要なのかもしれませんか?したがって、入力がによって提供されるまでハングします。p.getOutputStream()。write()

または、stdoutが消費されるまで待つことができます。

+0

いいえ、私は "java -jar .jar file.properties"としてプログラムを起動します。入力は今まで要求されていません – grog

関連する問題