Как установить размер кучи Java (Xms/Xmx) внутри контейнера Docker?

Что касается поднятия этого вопроса, Докер выглядит достаточно новым, чтобы не иметь ответов на этот вопрос в сети. Единственное место, которое я нашел, - это статья, в которой автор говорит, что это трудно, и все.

7 ответов

Решение

Я согласен, что это зависит от того, какой контейнер вы используете. Если вы используете официальный образ Tomcat, похоже, он достаточно прост, вам нужно будет передать JAVA_OPTS переменная окружения с вашими настройками кучи:

docker run --rm -e JAVA_OPTS='-Xmx1g' tomcat

См. Как установить параметры JVM?

Обратите внимание, что в docker-compose.yml файл - вам нужно пропустить двойные кавычки:

  environment:
  - JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m

или же

  environment:
  - CATALINA_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m

Обновление: Что касается этого обсуждения, Java поднял игру в отношении поддержки контейнеров. В настоящее время (точнее, с версии JVM 10) JVM достаточно умна, чтобы выяснить, работает ли она в контейнере, и если да, то каким объемом памяти она ограничена.

Таким образом, вместо того, чтобы устанавливать фиксированные ограничения при запуске вашей JVM, которые вам затем придется изменять в соответствии с изменениями ограничений вашего контейнера (ограничения ресурсов в мире K8s), просто ничего не делайте и позвольте JVM самостоятельно выработать ограничения.

Без какой-либо дополнительной настройки JVM установит максимальный размер кучи равным 25% от выделенной памяти . Поскольку это скромно, вы можете немного увеличить это, установив -XX:MaxRAMPercentageатрибут. Кроме того, есть -XX:InitialRAMPercentageдля начального размера кучи и -XX:MinRAMPercentageдля контейнеров с оперативной памятью менее 96 МБ.

Для получения дополнительной информации по теме, вот отличный обзор.

Вы также можете просто разместить эти настройки в своем изображении, чтобы в вашем Dockerfile было что-то похожее на следующее:

ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"

Вы можете сделать это, указав среду параметров java в файле docker compose

env: 
  - name: _JAVA_OPTIONS
    value: "-Xmx1g"

это изменит размер кучи.

Все зависит от того, как упаковано ваше Java-приложение и как его конфигурационные файлы предоставляются с помощью Docker.

Например, официальный образ Tomcat утверждает, что файл конфигурации доступен в расположении по умолчанию: /usr/local/tomcat/conf/

Так легко переопределить весь каталог или только один файл конфигурации:

docker run -it --rm -p 8080:8080 -v $PWD/catalina.properties:/usr/local/tomcat/conf/catalina.properties tomcat:8.0

Вы также можете установить значения и в файле docker , используя следующий способ.

      ENTRYPOINT ["java", "-Xms128M ", "-Xmx256M", "-jar", "your-precious-service-1.0.0.jar"]

Вы также можете игнорироватьXmsзначение и просто установитеXmxценить.

      ENTRYPOINT ["java", "-Xmx256M", "-jar", "your-precious-service-1.0.0.jar"] 

Для получения дополнительной информации прочитайте: https://akobor.me/posts/heap-size-and-resource-limits-in-kubernetes-for-jvm-applications .

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