Java Tomcat application Размер кучи намного больше, чем в используемой куче - PullRequest
1 голос
/ 31 января 2020

Я работаю над Java веб-приложением, которое работает на сервере памяти объемом 1 ГБ с Tomcat.

В последнее время мы заметили, что приложение потребляет большую часть памяти на этом сервере - около 83%.

Я профилировал приложение, используя VisualVM на моем персональном компьютере, с гораздо большим ОЗУ.

VisualVM показывает примерно 400 МБ используемого пространства кучи и до 1,4 ГБ выделенного пространства кучи.

Настройка -Xmx512m позволяет уменьшить выделенное пространство кучи без какого-либо существенного влияния на производительность сайтов. .

enter image description here

Несколько вопросов:

  1. Это более или менее нормально? Почему это происходит?
  2. Что можно сделать, чтобы уменьшить потребление памяти? Использование -Xmx для ограничения объема занимаемой памяти может быть проблемой, если приложению действительно нужно больше памяти.
  3. Если ОС требуется другое значение, скажем, 100 МБ для другого процесса, java освободит эту память для использования ОС, учитывая, что она не использует кучу, а только выделенную кучу, или операционная система столкнется с проблемой памяти?

1 Ответ

3 голосов
/ 31 января 2020

Отвечаю на ваши вопросы по порядку.

  1. Да, это нормально. Например, когда вы запускаете сервер с максимальной кучей 2 ГБ, то 2 ГБ резервируется для процесса java. Приложение может использовать его или не использовать полностью, но оно не может использовать более 2 ГБ, даже если у вас больше свободной памяти на уровне ОС, поскольку вы ограничили максимальное использование до 2 ГБ. Кроме того, это нормально, что приложение использует гораздо меньше памяти, скажем, только 100 МБ, и в этом случае используемый размер кучи будет намного меньше, чем общий размер кучи.
  2. Использование -Xms ограничивает выделенную память, профилирует ваше приложение с помощью ожидаемую загрузку или начинать с более низкой загрузки и посмотреть, нормально ли работает приложение, а также проанализировать использование памяти. Вам нужно запустить несколько тестов, изменяя настроенную память и сохраняя все остальные параметры, а именно. загрузите постоянную между несколькими запусками, чтобы найти оптимальное число.
  3. Нет, jvm не освободит память другому процессу, пока сервер не будет запущен. После запуска сервера максимальная конфигурация памяти для jvm будет зарезервирована для процесса jvm.
...