Как ограничить использование памяти Java-приложением, упакованным в банку (-Xmx, похоже, не работает) в Windows

Я хотел бы ограничить максимальный размер кучи для приложения Java, но, похоже, это не работает. Я запускаю приложение из пакета jar через bat в Windows. Содержимое летучей мыши:

@Echo off
set CLASSPATH=.
java -Xmx32m -classpath %CLASSPATH% -jar MyApplication.jar

Это должно ограничить максимальный размер кучи 32 мегабайтами. Однако, когда я делаю что-то с потреблением памяти с приложением, диспетчер задач Windows показывает, что потребление памяти составляет как минимум около 70 мегабайт ... Я даже пробовал с -Xmx2m, но это не имело никакого значения.

Итак, я не совсем уверен, в чем проблема. Конечно, в использовании памяти содержится стек и т. Д., Но память, используемая программой, должна быть в основном кучей...

Версия Java кажется 1.6.0_14.

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

РЕДАКТИРОВАТЬ: Хм.. Я был удивлен, что использование кучи было ограничено 32M на самом деле при мониторинге с помощью JConsole. Надо больше памяти использовать...

Спасибо за идеи, Токо


person Touko    schedule 18.09.2009    source источник


Ответы (6)


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

Для анализа памяти кучи вы можете использовать профилировщик (например, Yourkit) и посмотреть, соблюдается ли ограничение кучи -Xmx или нет. Это также поможет вам проанализировать интересующие вас части программы.

person vpram86    schedule 18.09.2009
comment
Да, я проверил консоль, и ограничение кучи действительно было соблюдено, разница между пространством кучи и другим использованием памяти была совсем другой, как я ожидал. С 20M мне удалось получить .OutOfMemoryError: пространство кучи Java - person Touko; 18.09.2009

Эмм... это не совсем так.

Хотя связь между -Xmx32m и тем, что вы видите в диспетчере задач, существует, она не является однозначной. Поймите, что Диспетчер задач сообщает не о размере вашей кучи, а о всей памяти, потребляемой JVM, из которой ваш код является лишь подмножеством.

person Stu Thompson    schedule 18.09.2009
comment
Да, теоретически я это знал, только не ожидал, что разница будет такой большой. - person Touko; 18.09.2009
comment
Он может быть огромным. Я только что опубликовал вопрос об этом сегодня ... мой сервер JVM потребляет в 3 раза больше максимального размера кучи! - person Stu Thompson; 18.09.2009

Вы видите сумму размера кучи и постоянной генерации. Размер разрешения можно настроить с помощью аргумента командной строки -XX:MaxPermSize. Например, это установит его на 128 м.

java -Xmx32m -XX:MaxPermSize=128m ...
person Billy Bob Bain    schedule 18.09.2009
comment
Вы забыли упомянуть память, которую потребляет JVM. Это не тривиально. - person Stu Thompson; 18.09.2009

Попробуйте установить -Xmx128 и посмотрите, получите ли вы OutOfMemoryError. Затем это должно подтвердить, что он, по крайней мере, установлен.

person DaveJohnston    schedule 18.09.2009

Возможно, вы на самом деле не используете так много памяти, но JVM использует внешние библиотеки и тому подобное.

Чтобы проверить эту теорию, вы можете использовать класс Runtime для просмотра общей памяти и используемой памяти.

person tster    schedule 18.09.2009

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

Вот довольно хороший список от IBM. Я нашел это довольно удобным время от времени.

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/rprf_javamemory.html

person Ashish Agarwal    schedule 03.06.2011