Как установить максимальное использование памяти для JVM?

133

Я хочу ограничить максимальный объем памяти, используемый JVM. Обратите внимание, это не просто куча, я хочу ограничить общий объем памяти, используемый этим процессом.

erotsppa
источник

Ответы:

95

используйте аргументы -Xms<memory> -Xmx<memory>. Используйте Mили Gпосле цифр для обозначения мегабайт и гигабайт соответственно. -Xmsуказывает минимум и -Xmxмаксимум.

Прабху Р
источник
1
вы также можете посмотреть на MaxPermSize.
urmalp
89
он спрашивает о памяти JVM. Вы сказали размер кучи. Они оба разные
vsingh
8
Чтобы повторить то, что упоминается в других комментариях, Xms и Xmx настраивают только кучу. Хотя настройка этих переменных косвенно влияет на пространство,
отличное от
2
UHU. Итак, я установил, -Xmx524Mи процесс занимает 1,2 ГБ ОЗУ. (?)
phil294
7
Это неправильный ответ, параметры -Xms и -Xmx регулируют только размер кучи jvm, а не общее выделение памяти.
Питер Де Винтер
31

Вам не стоит беспокоиться об утечке памяти из стека (это очень редко). Единственный раз, когда вы можете вывести стек из-под контроля, - это бесконечная (или действительно глубокая) рекурсия.

Это просто куча. Извините, сначала не полностью прочитал ваш вопрос.

Вам необходимо запустить JVM со следующим аргументом командной строки.

-Xmx<ammount of memory>

Пример:

-Xmx1024m

Это позволит использовать для JVM максимум 1 ГБ памяти.

jjnguy
источник
1
Это неправда, согласно этому потоку, есть несколько способов утечки за пределы кучи stackoverflow.com/questions/1475290/…
erotsppa
Вы правы, есть много способов получить проблемы с памятью, не относящиеся к стеку. Однако они не очень распространены.
jjnguy
9
Совершенно уверен, что вы не можете контролировать размер памяти без кучи, не так ли?
matt b
Уверен, что вы можете управлять им через -XX:MaxDirectMemorySize. Не то чтобы я тщательно профилировал, чтобы убедиться, но все же;)
alexandergunnarson
2
@alexandergunnarson MaxDirectMemorySizeзатрагивает только буферы NIO. Все виды другой собственной памяти используются JVM.
Кристофер Шульц
16

Если вы хотите ограничить память для jvm (а не размер кучи) ulimit -v

Чтобы получить представление о разнице между jvm и кучей памяти, взгляните на эту отличную статью http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- Java-process.html

vsingh
источник
8
Это ulimitкоманда Linux? Я быстро поискал в Google и не увидел никакой связи между ulimitJVM и JVM. Y
Сэм
Да, это команда Linux. tldp.org/LDP/solrhe/Securing-Optimizing-Linux-RH-Edition-v1.3/…
vsingh
11

Приведенный выше ответ отчасти правильный, вы не можете изящно контролировать, сколько собственной памяти выделяет java-процесс. Это зависит от того, что делает ваше приложение.

Тем не менее, в зависимости от платформы вы можете использовать какой-либо механизм, например ulimit, для ограничения размера java или любого другого процесса.

Только не ожидайте, что он изящно выйдет из строя, если достигнет этого предела. Сбои выделения собственной памяти намного сложнее обрабатывать, чем сбои выделения в куче java. Существует довольно высокая вероятность того, что приложение выйдет из строя, но в зависимости от того, насколько критично для системы, уменьшить размер процесса, который может вам все еще подходит.

SmoothieMonster
источник
1

NativeHeap можно увеличить на -XX: MaxDirectMemorySize = 256M (по умолчанию 128)

Я никогда этим не пользовался. Может быть, тебе это пригодится.

Марио Трукко
источник
1
Я сомневаюсь, что op этого хотел: когда вы вызываете код C / C ++ из java, используется собственная память.
om-nom-nom
6
собственная память также используется при выполнении вызовов nio, если вы выделяете буферы с прямой памятью. (... и загрузчики классов, и информация о
потоках