Ant Java task содержит параметр fork
, который по определению «если включено, запускает выполнение класса в другой виртуальной машине». Поскольку мы имеем дело с большим количеством данных, установка этого параметра спасла нас от истечения пространства кучи Java.
Мы хотим иметь возможность делать то же самое с помощью класса Java. Каким будет наилучший способ достижения функциональности, предоставляемой fork
?Java-эквивалент fork в Java-задаче Ant?
ответ
Выполнение другого процесса Java. Например, используя класс ProcessBuilder.
http://java.sun.com/javase/6/docs/api/java/lang/ProcessBuilder.html
Вы можете использовать столько рабочих процессов, как вы хотите. Заставьте их иметь отдельный основной класс, выполняя свои задания из этого основного класса и завершая работу, когда их задача будет завершена.
Вам нужно будет выяснить их путь к классам и расположение java-двоичного кода в системе, но это выполнимо.
Я думаю, вы даже можете быть уведомлены, когда они завершатся через Process.waitFor().
Я бы сказал, что это будет в той же самой VM. –
Нет, если вы запустите процесс, это будет другая виртуальная машина. Два разных Процесса не могут совместно использовать одну виртуальную машину любыми способами. – alamar
Я думаю, что вы можете напрямую использовать Ant API ... Ant может быть непосредственно использован в Java-классе. Javadoc доступен в своем двоичном дистрибутиве.
Если вы посмотрите на ant
исходный код, когда fork
является true
, то он просто обертывания Execute
задачу и в конечном счете, код, который вызывается в
Runtime.getRuntime().exec(cmd, env);
Загрузка и иметь взгляд на исходный код для org.apache.tools.ant.taskdefs.Java
и org.apache.tools.ant.taskdefs.Execute
предоставит вам несколько отличных указателей в поиске местоположения исполняемого файла для самостоятельной работы на платформе и т. д.
Если вам нужно больше кучи, чем рассмотреть варианты -Xmx и -Xms при запуске ваше приложение. Возможно, вам не нужны несколько процессов, а больше памяти. Добавлена польза от того, что в рамках одной JVM вы можете использовать примитивы потоков и параллелизма. – basszero
Справа. Мы попробовали это, установив Xms и Xmx в разные значения, но это не помогло. Программа в конечном итоге потерпела крах после запуска в течение разных периодов времени, в зависимости от установленных значений. По-видимому, это связано с памятью, но мы никогда не сталкивались, когда называли ее через Ant (с набором fork). – pugmarx