Как установить размер кучи Java (Xms/Xmx) внутри контейнера Docker?
Что касается поднятия этого вопроса, Докер выглядит достаточно новым, чтобы не иметь ответов на этот вопрос в сети. Единственное место, которое я нашел, - это статья, в которой автор говорит, что это трудно, и все.
7 ответов
Я согласен, что это зависит от того, какой контейнер вы используете. Если вы используете официальный образ Tomcat, похоже, он достаточно прост, вам нужно будет передать JAVA_OPTS
переменная окружения с вашими настройками кучи:
docker run --rm -e JAVA_OPTS='-Xmx1g' tomcat
Обратите внимание, что в 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 .