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

Другие вопросы по тегам