Отклонение использования памяти процессом 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, смешанный режим)