Java, похоже, игнорирует параметры -Xms и -Xmx

Я хотел бы запустить очень простого бота, написанного на java, на своем VPS. Я хочу ограничить память jvm, скажем, 10 МБ (я сомневаюсь, что это понадобится больше).

Я запускаю бота с помощью следующей команды:

java -Xms5M -Xmx10M -server -jar IrcBot.jar "/home/jbot"

Но top показывает, что фактическая память, зарезервированная для java, равна 144m (или я здесь неправильно интерпретирую?).

13614 jbot 17 0 144 м 16 м 6740 S 0,0 3,2 0:00,20 java

Есть идеи, что здесь может быть не так?

Версия Java "1.6.0_20" Java(TM) SE Runtime Environment (сборка 1.6.0_20-b02) Java HotSpot(TM) Client VM (сборка 16.3-b01, смешанный режим)

КСТАТИ. Я использую CentOS - если это имеет значение.

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы.

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


person Itako    schedule 23.06.2011    source источник
comment
java версии 1.6.0_20 Java(TM) SE Runtime Environment (сборка 1.6.0_20-b02) Java HotSpot(TM) Client VM (сборка 16.3-b01, смешанный режим)   -  person Itako    schedule 23.06.2011
comment
Вы можете отредактировать свой вопрос, чтобы уточнить (например, с информацией в вашем комментарии выше). Просто используйте ссылку редактирования под вопросом.   -  person T.J. Crowder    schedule 23.06.2011
comment
знание того, что именно показывает «верх», является хорошим началом, кроме того, параметры - это размер кучи, а у java также есть несколько разных пулов памяти.   -  person bestsss    schedule 23.06.2011
comment
Проблема не в языке. Если вы пытаетесь уменьшить объем памяти процесса, попробуйте установить размер стека, perm gen и т. д. на более низкие значения. Дополнительные преимущества могут быть получены, если вы переключитесь с альтернативной JVM (не Sun/Oracle) на другую, более подходящую для уменьшенного приложения.   -  person Michael    schedule 23.06.2011
comment
Кроме того, пока вам не нужно принимать какой-либо ответ. Действительный ответ не должен «давать вам то, что вы хотите» - вы хотели уменьшить размер своего процесса до 10 МБ, это нелегко - вы должны принять ответ, который дал вам эту информацию.   -  person Michael    schedule 23.06.2011


Ответы (3)


-Xmx указывает максимальное выделение кучи Java (-Xms указывает минимальное выделение кучи). Процесс Java имеет свои собственные накладные расходы (фактическая JVM и т. д.), а также загруженные классы и пространство perm gen (установленное с помощью -XX:MaxPermSize=128m) также находятся за пределами этого значения.

Думайте о выделении кучи просто как о «внутреннем рабочем пространстве» Java, а не как о процессе в целом.

Попробуйте поэкспериментировать, и вы поймете, что я имею в виду:

java -Xms512m -Xmx1024m ...

Кроме того, попробуйте использовать такой инструмент, как JConsole или JVisualVM (оба поставляются с Sun / Oracle JDK), и вы сможете увидеть графическое представление реальной кучи. использование (и настройки, которые вы использовали для ограничения размера).

Наконец, как очень справедливо отмечает @Peter Lawrey, резидентная память является здесь решающей фигурой - в вашем случае JVM использует только 16 МБ RSS (согласно «сверху»). Разделяемое/виртуальное распределение не вызовет никаких проблем, если куча JVM не помещается в своп (не в ОЗУ). Опять же, как я уже говорил в некоторых комментариях, есть и другие доступные JVM - «Java» вполне способна работать на платформах с низким уровнем ресурсов или встроенных платформах.

person Michael    schedule 23.06.2011

Xmx — это максимальный размер кучи, но помимо этого есть еще несколько вещей, которые JVM должна хранить в памяти: стек, классы и т. д. Для краткого введения см. этот пост о структуре памяти JVM.

person Theo    schedule 23.06.2011

Карты JVM в общих библиотеках составляют около 150 м. Объем используемой виртуальной памяти вряд ли будет важен, если вы пытаетесь минимизировать физическую основную память.

Число, на которое вы хотите посмотреть, - это резидентная память, которая представляет собой фактически используемый объем физической основной памяти (что составляет 16 МБ).

person Peter Lawrey    schedule 23.06.2011
comment
Можем ли мы определить размер только памяти кучи из дампа кучи? - person Vipin; 24.04.2014
comment
@Vipin Дамп кучи сбрасывает только кучу (и стеки потоков). Невозможно определить память вне кучи в дампе кучи. Размер дампа кучи является хорошим индикатором размера кучи, занятой на момент создания дампа. - person Peter Lawrey; 24.04.2014