JVM (JDK 8 до обновления 131), запущенная в контейнерах докеров, игнорировала ограничения CGroup, установленные средой контейнера. И они запрашивали ресурсы хоста, а не то, что было выделено для контейнера. Результат является катастрофическим для JVM, т. Е. Поскольку JVM пыталась выделить себе больше ресурсов (ЦП или памяти), чем разрешено ограничениями CGroup, демон докера заметил бы это и убил бы процесс JVM или сам контейнер, если бы java-программа была работает с pid 1.
Решение проблемы с памятью - (возможно, исправлено в обновлении 131 JDK 8). Как описано выше, JVM выделяла себе больше памяти, чем разрешено для контейнера. Это можно легко исправить с помощью
- явная установка максимального предела памяти кучи (с использованием
-Xmx
) при запуске JVM. (до обновления 131) - или передавая эти флаги - (после 131 обновления)
-XX:+UnlockExperimentalVMOptions
и-XX:+UseCGroupMemoryLimitForHeap
Устранение проблемы с процессором (возможно, исправлено в обновлении JDK 212). И снова, как описано выше, JVM, работающая в докере, будет напрямую смотреть на аппаратное обеспечение хоста и получать общее количество доступных процессоров. Затем он попытается получить доступ или выполнить оптимизацию на основе этих подсчетов ЦП.
- После обновления 212 JDK 8 любая JVM, работающая в контейнере докеров, будет соблюдать ограничения ЦП, выделенные для контейнера, и не будет напрямую смотреть в ЦП хоста. Если контейнер с ограничением ЦП запускается, как показано ниже, JVM будет соблюдать это ограничение и ограничится 1 ЦП.
docker run -ti --cpus 1 -m 1G openjdk:8u212-jdk
// jvms, запущенные в этом контейнере, ограничены 1 ЦП. - ВОПРОС: Проблема с процессором, вероятно, исправлена в обновлении 212 JDK8, но что, если я не могу обновить свою JVM и у меня установлена версия до обновления 131, как я могу исправить проблема с процессором.
FROM
в вашем образе и повторно запуститьdocker build
для обновления JVM. - person David Maze   schedule 08.10.2020CMD
илиENTRYPOINT
, т.е. передать аргументы jvm. - person Vamsh   schedule 08.10.2020