2013-09-22 3 views
1

Я запускаю приложение Java в Linux-кластере с SLURM в качестве менеджера ресурсов. Чтобы запустить мое приложение, я должен указать для SLURM объем памяти, который мне понадобится. SLURM будет запускать мое приложение в виде виртуальной машины с указанным объемом памяти. Чтобы сообщить моему java-приложению, сколько памяти он может использовать, я использую параметр -Xmx ## g. Я выбираю его на 1 ГБ меньше, чем я просил у SLURM.Как ограничить потребление памяти общей памяти Java VM?

Моя проблема в том, что я превысил объем памяти, который я выбрал на SLURM, и это прекращает мое приложение. Кажется, что JVM использует около 1 ГБ памяти, возможно, для таких вещей, как GC или около того.

Есть ли возможность ограничить размер JVM или, по крайней мере, приручить его.

Приветствия, Маркус

+0

Вы используете много потоков? Им нужна память для своих стеков (по умолчанию мне кажется, что 1mb), и это может не ограничиваться параметром Xmx. –

+0

Возможный дубликат [Как установить максимальное использование памяти для JVM?] (Http://stackoverflow.com/questions/1493913/how-to-set-the-maximum-memory-usage-for-jvm) – Thomas

+0

@inflagranti Я использую 6 потоков. По умолчанию размер 1mb, вероятно, недостаточен, чтобы объяснить, почему он сбой. – markus

ответ

3

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

  • нити укладывает
  • химическая завивка GEN
  • разделяемые библиотеки
  • родной памяти, используемые библиотеки
  • прямой памяти
  • памяти отображаются файлы.

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

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

. Чтобы сообщить моему java-приложению, сколько памяти он может использовать, я использую параметр -Xmx ## g. Я выбираю его на 1 ГБ меньше, чем я просил у SLURM.

В догадке я бы начать с 1/2 Гб с -Xmx512m и увидеть, что это резидентный пик и увеличить его, если вы обнаружите, что всегда есть несколько сотен MB уборная комната.

BTW 1 Гб памяти не так много в эти дни (всего лишь 5 долларов США). Ваше время может стоить гораздо больше, чем ресурсы, которые вы пытаетесь сохранить.

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