2009-05-13 11 views
3

Ant Java taskは、パラメータを提供します。これは、定義によって、"有効になっていると、別のVMでクラスの実行がトリガーされます"です。大量のデータを処理しているので、このパラメータを設定すると、Javaヒープ領域が不足することがなくなりました。
同じことをJavaクラスで実行できるようにしたいと考えています。 forkによって提供される機能を実現する最善の方法は何ですか?AntのJavaタスクでのforkのJava同等?

+0

起動時に-Xmxと-Xmsオプションを使用するよりもヒープが必要な場合は、あなたのアプリ。たぶんあなたは複数のプロセスを必要としないかもしれません。同じJVM内でスレッドと同時実行プリミティブを使用できるという利点もあります。 – basszero

+0

権利。私たちはXmsとXmxをさまざまな値に設定することでそれを試みましたが、それは助けになりませんでした。プログラムは、設定された値に応じて、さまざまな期間実行された後に最終的にクラッシュしました。どうやら、それはメモリと関係がありますが、私たちがAnt(forkセットを使って)を介して呼び出すときには決して直面しませんでした。 – pugmarx

答えて

8

別のJavaプロセスを実行します。たとえば、ProcessBuilderクラスを使用します。

http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html

好きなだけのワーカープロセスを実行することができます。別のメインクラスを持ち、そのメインクラスからタスクを実行し、タスクが完了したら終了します。

システム上のクラスパスとjavaバイナリの場所を把握する必要がありますが、それは実行可能です。

Process.waitFor()で完了したときに通知を受けることさえできると思います。

+0

しかし、私はそれが同じVM内にあると思っています。 –

+4

いいえ、プロセスを実行する場合は、別のVMです。 2つの異なるプロセスは、いずれの方法でも1つのVMを共有できません。 – alamar

0

私はあなたがAnt APIを直接使用できると思います... AntはJavaクラスで直接使用できます。 Javadocはバイナリ形式で入手できます。あなたはantソースコードを見ればforktrue、あるとき

3

、それはちょうどExecuteタスクをラップし、最終的には、呼び出されるコードが

Runtime.getRuntime().exec(cmd, env); 

ダウンロードし、ソースコードを見てみましたorg.apache.tools.ant.taskdefs.Javaorg.apache.tools.ant.taskdefs.Executeの場合、プラットフォームに依存しない方法で実行する実行ファイルの場所を見つける上で参考になるでしょう。