2009-05-13 10 views
3

Ant Java task bietet fork Parameter, die per Definition "wenn aktiviert aktiviert die Klassenausführung in einer anderen VM". Da wir mit einer großen Datenmenge zu tun haben, hat uns die Einstellung dieses Parameters davor bewahrt, dass der Java-Heap-Speicher aufgebraucht ist.
Wir wollen in der Lage sein, das gleiche über eine Java-Klasse zu tun. Was wäre der beste Weg, um die Funktionalität von fork zu erreichen?Java-Äquivalent von Fork in Java-Aufgabe von Ant?

+0

Wenn alles, was Sie brauchen, ist mehr Heap als die Verwendung der Optionen -Xmx und -Xms, wenn Sie starten deine App Vielleicht brauchen Sie nicht mehrere Prozesse, sondern nur mehr Speicher. Es gibt einen zusätzlichen Vorteil, dass Sie innerhalb derselben JVM Threads und Parallelitätsprimitive verwenden können. – basszero

+0

Rechts. Wir haben das versucht, indem wir Xms und Xmx auf verschiedene Werte gesetzt haben, aber das hat nicht geholfen. Das Programm stürzte schließlich ab, nachdem es für unterschiedliche Dauer ausgeführt wurde, abhängig von den eingestellten Werten. Offensichtlich hat es etwas mit Speicher zu tun, aber wir haben es nie gesehen, als wir es über Ant (mit Fork Set) aufgerufen haben. – pugmarx

Antwort

8

Einen weiteren Java-Prozess ausführen. Beispielsweise durch die Verwendung der ProcessBuilder-Klasse.

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

Sie können so viele Arbeitsprozesse laufen wie Sie wollen. Machen Sie sie zu einer separaten Hauptklasse, erledigen Sie ihre Aufgaben von dieser Hauptklasse und beenden Sie ihre Aufgabe.

Sie müssen herausfinden, ihre Klassenpfad und die Position von Java-Binärdateien auf dem System, aber das ist machbar.

Ich denke, Sie können sogar benachrichtigt werden, wenn sie über Process.waitFor() abgeschlossen werden.

+0

Ich denke, es wäre jedoch in der gleichen VM. –

+4

Nein, wenn Sie einen Prozess ausführen, ist es die andere VM. Zwei verschiedene Prozesse können auf keinen Fall eine VM gemeinsam nutzen. – alamar

0

Ich denke, Sie können direkt die Ant-API verwenden ... Ant kann direkt in einer Java-Klasse verwendet werden. Das Javadoc ist in ihrer Binärdistribution verfügbar.

3

Wenn Sie an der ant Quellcode schauen, wenn forktrue ist, dann wickelt es nur eine Execute Aufgabe und schließlich der Code,

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

Download ist aufgerufen wird und einen Blick auf den Quellcode für org.apache.tools.ant.taskdefs.Java und org.apache.tools.ant.taskdefs.Execute gibt Ihnen einige gute Zeiger in der Suche nach dem Speicherort der ausführbaren Datei auf einer plattformunabhängigen Art und Weise usw.