3

コマンド ラインから特定のプロセスを直接開始すると、2 ~ 3 秒で完全に開始されます。

Java プログラムからまったく同じコマンドを使用してまったく同じプロセスを開始すると、親が破棄されない限り、開始時にハングします。なんで?

ProcessBuilder の場合:

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

Runtime.exec の場合:

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

いずれにしても、新しい Process オブジェクトを null に設定せず、すぐにガベージ コレクターを呼び出さないと、新しいプロセスは 3 秒で実行する必要があるのと同じことを実行するのに最大 3 分かかります。

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

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

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

ありがとうございました、

ごきげんよう

4

2 に答える 2

1

Java アプリケーションから外部プログラムを実行することは、正しく理解するのが難しいことで有名です。

高品質のApache Commons Exec ライブラリを使用することをお勧めします。

コードに依存関係を追加したくない場合は、少なくともExec ライブラリの Java コードを見て、プロセスがどのように作成および実行されるかを確認してください。

于 2011-12-07T15:16:33.573 に答える
0

子プロセスが stdin からの入力を必要としている可能性がありますか? そのため、入力がp.getOutputStream().write()によって提供されるまでハングします

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

于 2011-12-07T15:17:59.733 に答える