Java, кажется, игнорирует опции -Xms и -Xmx - PullRequest
8 голосов
/ 23 июня 2011

Я хотел бы запустить очень простой бот, написанный на 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) Клиентская виртуальная машина (сборка 16.3-b01, смешанный режим)

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

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

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

Ответы [ 3 ]

10 голосов
/ 23 июня 2011

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

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

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

java -Xms512m -Xmx1024m ...

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

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

6 голосов
/ 23 июня 2011

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

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

5 голосов
/ 23 июня 2011

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

...