Java отказывается запускаться - не удалось зарезервировать достаточно места для кучи объектов

Background

У нас есть пул из примерно 20 лезвий Linux. Некоторые используют Suse, некоторые используют Redhat. ВСЕ разделяют пространство NAS, которое содержит следующие 3 папки:

/NAS/app/java - a symlink that points to an installation of a Java JDK. Currently version 1.5.0_10 /NAS/app/lib - a symlink that points to a version of our application. /NAS/data - directory where our output is written

Все наши машины имеют 2 процессора (гиперпоточные) с 4 ГБ физической памяти и 4 ГБ пространства подкачки. Мы ограничиваем количество «рабочих мест»; каждая машина может обрабатывать в определенное время до 6 (это число, вероятно, нужно изменить, но это не входит в текущую проблему, поэтому, пожалуйста, пока игнорируйте ее).

Некоторые из наших заданий устанавливают максимальный размер кучи 512 МБ, некоторые другие резервируют максимальный размер кучи 2048 МБ. Опять же, мы понимаем, что можем перебрать доступную память, если на одном компьютере запущено 6 заданий с размером кучи 2048, но, насколько нам известно, этого еще не произошло.

The Problem

Время от времени задание немедленно завершается неудачей со следующим сообщением:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Мы привыкли записывать это на слишком много заданий, выполняемых одновременно на одной и той же машине. Проблема случалась достаточно редко (MAYBE один раз в месяц), что мы просто перезапустим его, и все будет хорошо.

Проблема в последнее время стала намного хуже. Все наши задания, которые запрашивают максимальный размер кучи 2048 м, сразу же почти каждый раз терпят неудачу, и перед выполнением их необходимо перезапустить несколько раз.

Мы вышли на отдельные машины и попытались выполнить их вручную с тем же результатом.

Debugging

Оказывается, проблема существует только для наших коробок SuSE. Причина, по которой это происходит чаще, заключается в том, что мы добавили больше машин, а новые - SuSE.

«cat / proc / version»; на коробках SuSE дают нам:

Linux version 2.6.5-7.244-bigsmp (geeko@buildhost) (gcc version 3.3.3 (SuSE Linux)) #1 SMP Mon Dec 12 18:32:25 UTC 2005

«cat / proc / version»; на RedHat коробки дают нам:

Linux version 2.4.21-32.0.1.ELsmp ([email protected]) (gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-52)) #1 SMP Tue May 17 17:52:23 EDT 2005

«uname -a»; дает нам следующее на обоих типах машин:

UTC 2005 i686 i686 i386 GNU/Linux

На компьютере не выполняется никаких заданий, и никакие другие процессы не используют много памяти. Все процессы, запущенные в данный моментmight использовать 100 МБ всего.

& APOS; сверху & APOS; на данный момент показывает следующее:

Mem:   4146528k total,  3536360k used,   610168k free,   132136k buffers
Swap:  4194288k total,        0k used,  4194288k free,  3283908k cached

& APOS; vmstat & APOS; на данный момент показывает следующее:

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in    cs us sy id wa
0  0      0 610292 132136 3283908    0    0     0     2   26    15  0  0 100  0

Если мы запустим задание со следующей командной строкой (Max Heap из 1850mb), то все будет хорошо:

java/bin/java -Xmx1850M -cp helloworld.jar HelloWorld
Hello World

Если мы увеличим максимальный размер кучи до 1875 Мб, это не удастся:

java/bin/java -Xmx1875M -cp helloworld.jar HelloWorld
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

Совершенно ясно, что используемая в настоящее время память предназначена для буферизации / кэширования, и поэтому так мало отображается как «свободная». Что не ясно, так это то, почему существует волшебная линия в 1850 Мб, где все, что выше, означает, что Java не может начаться.

Любые объяснения будут с благодарностью.

Ответы на вопрос(15)

Ваш ответ на вопрос