Было бы намного лучше, если бы вы использовали набор долгоживущих процессов, извлекающих ваши данные из очередей и отправляющих их обратно, которые постоянно разветвляют новые процессы для каждого события, особенно из хост-JVM с этой огромной кучей.
Создание 240-гигабайтного изображения не является бесплатным, оно потребляет большое количество виртуальных ресурсов, хотя бы на секунду.ОС не знает, как долго новый процесс будет в курсе, поэтому она должна подготовиться так, как будто весь процесс будет долгоживущим, поэтому она устанавливает виртуальный клон всех 240 ГБ, прежде чем уничтожить его с помощью вызова exec.
Если бы вместо этого у вас был долгоживущий процесс, к которому вы могли бы завершить объекты через некоторый механизм очереди (а их много для Java, C и т. Д.), Это избавило бы вас от некоторого давления процесса разветвления.
Я не знаю, как вы переносите данные из JVM во внешнюю программу.Но если ваша внешняя программа может работать с stdin / stdout, то (если вы используете unix), вы можете использовать inetd.Здесь вы делаете простую запись в файле конфигурации inetd для вашего процесса и назначаете ему порт.Затем вы открываете сокет, засыпаете в него данные и затем читаете обратно из сокета.Inetd обрабатывает детали сети для вас, и ваша программа работает просто с помощью stdin и stdout.Имейте в виду, что у вас есть открытый сокет в сети, который может быть безопасным при вашем развертывании.Но настроить даже устаревший код для запуска через сетевой сервис довольно просто.
Вы можете использовать простую оболочку, подобную этой:
#!/bin/sh
infile=/tmp/$$.in
outfile=/tmp/$$.out
cat > $infile
/usr/local/bin/process -input $infile -output $outfile
cat $outfile
rm $infile $outfile
Это не самый высокопроизводительный сервер на планетерассчитан на миллионы транзакций, но это намного быстрее, чем разветвление 240 ГБ снова и снова.