Отклонение использования памяти процессом Java от выделенной памяти jcmd

Я вижу большие различия в использовании памяти для процесса Java (выполняющегося в Docker), по сравнению с использованием памяти, как сообщает jcmd, который отслеживает процесс JVM. Использование памяти JVM в соответствии с jcmd довольно стабильно, но использование памяти из ps (RSS) постоянно увеличивается примерно вдвое по сравнению с дисперсией выделенной памяти JVM. Дисперсия JVM вызвана небольшим увеличением кэша кода и небольшим увеличением внутренней памяти.

Вопросы:

  • Что может вызвать такое отклонение и как я могу отследить его, чтобы устранить основную причину?
  • Почему существует такая большая разница между использованием памяти, как сообщают PS и JCMD?

Память, отслеживаемая ps aux, будет увеличиваться до тех пор, пока OOM ядра (мы используем мягкие ограничения памяти, чтобы задержать неизбежный OOM).

Например: момент времени № 1

  • ps aux RSS 2682980
  • Отслеживание собственной памяти JCMD: Всего: зарезервировано =3625201 КБ, зафиксировано =2423489 КБ

Момент времени № 2

  • ps aux RSS 2775140
  • Отслеживание собственной памяти JCMD: Всего: зарезервировано =3627331 КБ, зафиксировано =2427371 КБ

Другие детали:

  • Своп отключен
  • java.nio.BufferPool.MemoryUsed: 10,3MB
  • ОПЦИИ JVM: -javaagent:/opt/newrelic/newrelic.jar -server -Xms1792m -Xmx1792m -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=192M -XX:+UseG1GC -XX:+UseStringDeduplication

Некоторые версии:

  • Linux: amzn-ami-xxx-amazon-ecs-optimized
  • Версия докера: 17.06.2-ce
  • Java-версия "1.8.0_121"
  • Java (TM) SE Runtime Environment (сборка 1.8.0_121-b13)
  • Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 25.121-b13, смешанный режим)

0 ответов

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