Потребление памяти JVM

9

Я пытаюсь запустить Tomcat в системе с низким объемом памяти (150-256 МБ). Несмотря на то, что я запускаю JVM с -Xmx64m (который должен быть по умолчанию в любом случае), этот процесс сразу же занимает 200Mb +.

Интересно, зачем JVM так много памяти, или есть способ настроить это? Другие JVM лучше, чем солнечные, для низкого потребления памяти - и работают ли они с tomcat?

Draemon
источник

Ответы:

5

В дополнение к куче (указанной с помощью -Xmsи -Xmx) необходимо включить области без кучи. К ним относятся

  • Perm Gen - 64 МБ в 32-битных системах и 96 МБ в 64-битных системах изначально
  • Кэш кода, который составляет от 20 до 40 МБ в зависимости от JVM
  • Область буфера NIO (откуда DirectByteBufferвзяты s), это изначально 64 МБ

Также есть рабочее пространство самой JVM, которое будет несколько десятков мегабайт.

Вы также должны знать об автоматическом определении размеров Sun JVM при использовании компьютера серверного класса . Со временем определение серверного класса (2 Гб памяти, более одного ядра) претерпело некоторую амортизацию, и теперь большинство машин способны инициировать -serverоптимизацию. Мой совет всегда указать -Xmsи -Xmxпараметры и передать , -serverесли вы не можете думать о хорошем причина не слишком.

Дейв Чейни
источник
Остерегайтесь также виртуальной памяти, которую JVM только резервирует и еще не использует.
Стив Шнепп
Правда, большинство этих сегментов, таких как PermGen и кэш кода, распределяются при запуске, но большинство ядер будут избегать выделения страниц этим сегментам до тех пор, пока они не понадобятся.
Дейв Чейни
1
Спасибо за информацию - думаю, это объясняет, куда идет память. Есть ли способ изменить эти значения? Еще лучше было бы узнать, сколько из каждого раздела использовалось - я не знаю, позволяли ли вам какие-либо инструменты отладки / мониторинга Java?
Draemon
1
Вы можете использовать pmap или jmap, чтобы получить представление о различных используемых сегментах. Большинство общих параметров (и их значения по умолчанию) перечислены здесь, java.sun.com/javase/technologies/hotspot/vmoptions.jsp . Они часто меняются и подвержены различиям в ОС (обычно размер стека) и архитектуре (64-битные ОС обычно подразумевают большие области JVM)
Дейв Чейни
3

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

«Спасибо за память» * - хорошая статья, которая объясняет, как JVM использует память ...

Кроме того, вы можете попробовать IBM JVM, она должна работать с Tomcat, не знаю, работают ли некоторые из бесплатных реализаций JVM.

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

* Поскольку новые пользователи не могут отправлять гиперссылки, вам нужно самостоятельно поискать эту статью ... она впервые попала в Google на "спасибо за память ibm".

dertoni
источник
3
ibm.com/developerworks/java/library/j-nativememory-linux - Ссылка на статью «Спасибо за память»
StackKrish
2

Также попробуйте JVM JRockit, который занимает меньше памяти. Вы все еще можете скачать лицензионные версии BEA JRockit бесплатно. то есть версии до того, как Oracle принял BEA.

См. Http://forums.oracle.com/forums/thread.jspa?threadID=816133&tstart=0 ссылки для загрузки.

StackKrish
источник
0

Одна полезная техника, которую я нашел, состоит в том, чтобы использовать мониторинг JMX, чтобы точно определить, сколько памяти используется пространством кучи против permgen.

Настройте JMX в Tomcat, как описано здесь http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Затем используйте JConsole (поставляется с JDK 5 или JDK 6) - тег памяти будет отслеживать потребление памяти с течением времени.

Также - остерегайтесь мягких перезапусков веб-приложений. Если вы перезагрузите веб-приложение, пространство permgen не будет собирать мусор и будет расти со временем. Вам нужно сделать полную остановку / запуск Tomcat, чтобы освободить пространство permgen.

Will Glass
источник
VisualVM также может использоваться вместо JConsole и дает еще больше подробностей при поиске проблем с памятью в JVM. Я должен был использовать это не раз, чтобы найти проблемы.
Джереми Бауз