Docker - Java контейнер не учитывает ограничения памяти - PullRequest
0 голосов
/ 03 февраля 2020

Я читал несколько сообщений об ограничении памяти JVM контейнера, пока ничего не получалось, я не знаю, где я портлю.

Я сделал простой "Hello World" весной Загрузка, используя контроллер REST, больше ничего нет.

Такое приложение было экспортировано в виде файла WAR, запустив его с образом Tomcat JDK 11, я также могу запустить его, используя образ JDK с FatJar, но проблема сохраняется в любом случае.


Ожидается

Если мой контейнер Java не займет более 25 МБ памяти (ради числа, может быть подробнее)

Фактический

Такое простое приложение занимает 200 - 250 МБ памяти в docker stats


Dockerfile

FROM tomcat:9.0.30-jdk11-corretto
COPY tomcat.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh","run"]

docker -compose.yml

version: '3.7'

services:
    hello:
        build:
            context: .
            dockerfile: Dockerfile
        image: app-test
        environment:
            - JVM_OPTS=-Xms13m -Xmx25m
        ports:
            - 8080:8080

Я пробовал

-Xms13m -Xmx25m

-XX: PermSize = 13m -XX: MaxPermSize = 25m

Среди других флагов, которые я уже удалил и забыл о

Ответы [ 3 ]

2 голосов
/ 03 февраля 2020

Чтобы ограничить память для docker контейнеров, вам необходимо добавить следующее в ваш файл docker -compose.yml

environment:
  - <name>=<value>
deploy:
  resources:
    memory: 256M

После добавления вышеуказанного кода контейнеры будут ограничены предел памяти, и вы можете увидеть результат в docker stats вывод. Для получения более подробной информации об ограничении ресурсов см. эту docker документацию.

Примечание : если контейнер пересекает указанный предел памяти, ядро ​​уничтожит контейнер.

1 голос
/ 04 февраля 2020

Независимо от того, какой объем памяти вы установили для кучи JVM (-Xmx), существует много других типов памяти без кучи, которую использует JVM: Java использует намного больше памяти, чем размер кучи (или размер корректно *) 1009 * предел памяти) - это нужно учитывать.

Вы также можете вообще избежать установки -Xmx и вместо этого использовать -XX: MaxRAMPercentage: Разъяснение значения новых параметров памяти JVM InitialRAMPercentage и MinRAMPercentage

1 голос
/ 03 февраля 2020

Переменная окружения, от которой зависит tomcat. Сценарий sh зависит от java параметров: JAVA_OPTS. Если вы измените файл compose для использования следующей переменной env, он должен работать.

environment: - JAVA_OPTS=-Xmx128m -Xms128m

Помимо того факта, что 25m кажется слишком малой памятью для JVM с запущенным tomcat .

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