Почему мой процесс Java потребляет вдвое больше памяти внутри контейнера докера по сравнению с хостом - PullRequest
0 голосов
/ 06 июня 2018

Я столкнулся с интересной проблемой, пытаясь проанализировать потребление памяти в моем Java-приложении, работающем в Docker-контейнере в сравнении с хост-машиной.

  1. Java-приложение - это веб-приложение на сервере Jetty 9.4.9
  2. Java-версия: 1.8
  3. Хост: MAC
  4. Образы докера: jetty: 9.4-jre8
  5. Демон docker - версия 18.03.1-ce.

На хосте я использую инструмент Yourkit для анализа потребления памяти.

Для контейнера Docker docker stats <docker id/name>

То, что я получаю, это то, что на MAC yourkitпоказывает мне 50M Размер без кучи + ~ 40M размер кучи, всего ~ 100M

enter image description here

Принимая во внимание, когда я развертываю иведите ту же войну с контейнером, статистика показывает мне 200M

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
879fb113ca8d        jetty-app           0.19%               214.6MiB / 1.952GiB   10.74%              1.49MB / 88.9kB     31.7MB / 6.42MB     29

Может кто-нибудь пролить свет на это явление?

Предполагая, что stats дает неправильные результаты, я пытался ограничить память в контейнере, используя флаг --memory, это мало помогает, я получаю OOM.

Заранее спасибо

1 Ответ

0 голосов
/ 15 мая 2019

Возможно, вы захотите попробовать снова измерить с openJDK 8u212 или более (16 апреля 2019 г.).(Oracle JDK отсутствует, поскольку их лицензия изменилась )

См. " Поддержка Docker в Java 8 - наконец-то! " из Grzegorz Kocur .
Теперь:

Больше нет необходимости использовать хакерские обходные пути в точке входа в докер, а также не устанавливать Xmx в качестве фиксированного значения.

Поддержка Dockerтакже был перенесен в Java 8.
Давайте проверим новейшее изображение openjdk, помеченное как 8u212.Мы ограничим память до 1 ГБ и будем использовать 1 ЦП:

docker run -ti --cpus 1 -m 1G openjdk:8u212-jdk

Вы можете точно настроить размер кучи с помощью новых флагов (уже присутствующих в Java 10+, но теперь обратно портированных наJava 8) и объяснено здесь .

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

Если по какой-то причине новое поведение JVM нежелательно, его можно отключить с помощью - XX:-UseContainerSupport.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...