如何在 Docker 容器中设置 Java 堆大小 (Xms/Xmx)



在提出这个问题时,Docker看起来足够新,在网上没有这个问题的答案。我找到的唯一地方是这篇文章,作者说它很难,仅此而已。

请注意,在docker-compose.yml文件中 - 您需要省略双引号:

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

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

我同意这取决于您使用的容器。如果您使用的是官方的 Tomcat 映像,它看起来很简单,您需要将 JAVA_OPTS 环境变量与堆设置一起传递

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

请参阅如何设置 JVM 参数?

更新:关于这个讨论,Java已经提高了关于容器支持的游戏。如今(或者更准确地说,从JVM版本10开始),JVM足够聪明,可以确定它是否在容器中运行,如果是,它被限制为多少内存。

因此,与其在启动 JVM 时设置固定限制,然后您必须根据容器限制(K8s 世界中的资源限制)的变化进行更改,不如什么都不做,让 JVM 自己制定限制

在没有任何额外配置的情况下,JVM 会将最大堆大小设置为已分配内存的 25%。由于这是节俭的,您可能希望通过设置 -XX:MaxRAMPercentage 属性来增加一点。此外,初始堆大小也有-XX:InitialRAMPercentage,RAM 小于 96MB 的容器也有-XX:MinRAMPercentage

有关该主题的更多信息,这里有一个很好的概述。

您也可以将这些设置放在映像中,以便在 Dockerfile 中存在类似以下内容的内容:

ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"
您可以通过

在 docker 撰写文件中指定 Java 选项环境来实现

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

您也可以使用以下方式在 dockerfile 中设置XmsXmx值。

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

最新更新