Java-приложение, работающее как jsvc, использует больше памяти, чем Heap+PermGen
У меня есть следующий сервер:
- Ubuntu Server 12.04 LTS 64Bit
- Нет графического интерфейса, просто командная строка
- 4 ГБ ОЗУ
- 2 ядра
- Ничто другое не работает, кроме Nagios NRPE и Webmin
- vm.swappiness = 0
Ничего особенного здесь, запуск Java-приложения:
- работает круглосуточно как демон с использованием jsvc
-Xmx2500M
-XX:+UseConcMarkSweepGC
- другие настройки не сделаны
- Использование OpenJDK 7
- JMX Server включен и проверяет каждую минуту с помощью nagios
Однако это не должно использовать всю память и приводит к тому, что Java-приложение не отвечает nagios через JMX.
Почему это использует всю мою память и создает SWAP?
2 ответа
Ваш -Xmx2500M - это максимальный размер кучи, доступный в вашем Java-приложении. Затраты на запуск JVM и управление объектами в этой куче обычно на 50% больше, но могут быть в два раза больше размера кучи. Команда top Linux покажет это в использовании виртуальной памяти.
Хорошее обсуждение использования памяти без кучи можно найти в презентации, связанной здесь. На эту тему есть еще одна тема
Одна быстрая проверка, которую вы можете сделать с OpenJDK в Ubuntu, - это запустить jps, чтобы увидеть, какой это идентификатор процесса, затем jconsole, выбрать вкладку памяти, а затем выбрать использование памяти без кучи.
Если вы пытаетесь запустить без подкачки, я думаю, вам нужно будет поэкспериментировать с различными размерами кучи, чтобы увидеть, какой сценарий может запускать ваше приложение.,
Пытаться -Xmx2500M
не -Xmx=2500M
вам не нужны опции =, -X отличаются от -Dkey= значения системных свойств, где используется =
http://javahowto.blogspot.co.uk/2006/06/6-common-errors-in-setting-java-heap.html