2010-12-30 2 views
1

может кто-нибудь предложить альтернативу Runtime.getRuntime(). Exec функции java. Я передаю команду unix в качестве аргумента этой функции, но это вызывает проблему с памятью. Runtime.getRuntime(). Exec запускает новый процесс с точно таким же объемом памяти, что и занятый процессом Java, в результате чего потребность в памяти удваивается, чего я не хочу.проблема с памятью с runtime.getruntime.exec

+1

Когда процесс вилки, как это, он не удваивает память, вместо этого он отмечает память как копию на запись. В дочернем процессе не используется дополнительная память, кроме того, что она использует. –

+0

«что приводит к удвоению объема памяти»: Какие у вас есть доказательства того, что потребность в памяти удваивается? У вас есть какие-то измерения, или это просто ваше предположение, что это так? Я настроен скептически. – Raedwald

+0

Привет, Раэдвальд, я ошибался в словах, что потребность в памяти удваивается. Тем не менее, после того, как я провел несколько тестов, я заметил, что могу запустить свою простую программу java с -Xms3850m в своем unix-блоке. Однако, когда я помещал строку «Runtime.getRuntime.exec (« test.sh ») в мою java-программу, -Xms не должен превышать 2500 м, а это означает, что Runtime.getRuntime.exec потребляет 1350 МБ. Поскольку test.sh - очень простой скрипт, он не занимает больше нескольких мб, когда я запускаю его самостоятельно в unix-окне. Можете ли вы предложить, как я могу использовать программу java для использования меньше памяти вместо использования 1350 мб? Спасибо –

ответ

0

Это не является обязательным и зависит от операционной системы. В Linux память «лениво» выделяется, пока она не понадобится. Ключевыми словами, которые вы ищете, являются «превышение памяти», что может возникнуть здесь.

Прочитать "How does fork handle memory", или this, чтобы узнать больше. Вероятно, вы отключили поведение overcommit, поэтому ваш разветвленный процесс всегда выделяет всю память немедленно.

+0

Hi. Я ошибался в sayign, что требование mem удваивается, однако оно действительно значительно увеличивается (1300mb в моем случае). После того, как я провел несколько тестов, я заметил, что могу запустить простейшую программу java с -Xms3850m в своем unix-боксе. Однако, когда я помещал строку «Runtime.getRuntime.exec (« test.sh ») в мою java-программу, -Xms не должен превышать 2500 м, а это означает, что Runtime.getRuntime.exec потребляет 1350 МБ. –

+0

Поскольку test.sh - очень простой скрипт, он не занимает больше нескольких мб, когда я запускаю его самостоятельно в unix-окне. Можете ли вы предложить, как я могу использовать программу java для использования меньше памяти вместо использования 1350 мб? Спасибо –

+0

Привет, Даниэль, ссылка на overcommit имеет смысл. Однако я не могу его использовать. Пожалуйста, посоветуйте мне, как его установить. –

Смежные вопросы