如何在 Docker 容器内设置 Java 堆大小 (Xms/Xmx)?
How to set Java heap size (Xms/Xmx) inside Docker container?
在提出这个问题时,Docker 看起来很新,网上还没有这个问题的答案。我找到的唯一地方就是this article作者说的很难,就是这样。
这完全取决于您的 Java 应用程序是如何打包的,以及它的配置文件是如何使用 Docker 公开的。
例如 official tomcat image 指出配置文件在默认位置可用:/usr/local/tomcat/conf/
覆盖整个目录或仅覆盖一个配置文件非常容易:
docker run -it --rm -p 8080:8080 -v $PWD/catalina.properties:/usr/local/tomcat/conf/catalina.properties tomcat:8.0
我同意这取决于您使用的容器。如果你使用官方的 Tomcat image,看起来很简单,你需要将 JAVA_OPTS
环境变量与你的堆设置一起传递:
docker run --rm -e JAVA_OPTS='-Xmx1g' tomcat
您也可以只将这些设置放在您的映像中,这样您的 Dockerfile 中就会存在如下内容:
ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"
请注意,在 docker-compose.yml
文件中 - 您需要省略双引号:
environment:
- JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
或
environment:
- CATALINA_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
您可以通过在 docker 撰写文件
中指定 java 选项环境来完成
env:
- name: _JAVA_OPTIONS
value: "-Xmx1g"
它将改变堆大小。
更新: 关于这个讨论,Java 已经升级了关于容器支持的游戏。如今(或者更确切地说,自从 JVM 版本 10 以来),JVM 已经足够聪明,可以判断它是否 运行 在容器中,如果是,它的内存限制是多少。
因此,与其在启动 JVM 时设置固定限制(然后您必须根据容器限制(K8s 世界中的资源限制)的变化来更改这些限制),不如什么也不做,让JVM 为自己制定限制.
无需任何额外配置,JVM 会将最大堆大小设置为已分配内存的 25%。由于这很节俭,您可能希望通过设置 -XX:MaxRAMPercentage
属性来提高一点。此外,初始堆大小为 -XX:InitialRAMPercentage
,RAM 小于 96MB 的容器为 -XX:MinRAMPercentage
。
有关该主题的更多信息,here 是一个很好的概述。
在提出这个问题时,Docker 看起来很新,网上还没有这个问题的答案。我找到的唯一地方就是this article作者说的很难,就是这样。
这完全取决于您的 Java 应用程序是如何打包的,以及它的配置文件是如何使用 Docker 公开的。
例如 official tomcat image 指出配置文件在默认位置可用:/usr/local/tomcat/conf/
覆盖整个目录或仅覆盖一个配置文件非常容易:
docker run -it --rm -p 8080:8080 -v $PWD/catalina.properties:/usr/local/tomcat/conf/catalina.properties tomcat:8.0
我同意这取决于您使用的容器。如果你使用官方的 Tomcat image,看起来很简单,你需要将 JAVA_OPTS
环境变量与你的堆设置一起传递:
docker run --rm -e JAVA_OPTS='-Xmx1g' tomcat
您也可以只将这些设置放在您的映像中,这样您的 Dockerfile 中就会存在如下内容:
ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"
请注意,在 docker-compose.yml
文件中 - 您需要省略双引号:
environment:
- JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
或
environment:
- CATALINA_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
您可以通过在 docker 撰写文件
中指定 java 选项环境来完成env:
- name: _JAVA_OPTIONS
value: "-Xmx1g"
它将改变堆大小。
更新: 关于这个讨论,Java 已经升级了关于容器支持的游戏。如今(或者更确切地说,自从 JVM 版本 10 以来),JVM 已经足够聪明,可以判断它是否 运行 在容器中,如果是,它的内存限制是多少。
因此,与其在启动 JVM 时设置固定限制(然后您必须根据容器限制(K8s 世界中的资源限制)的变化来更改这些限制),不如什么也不做,让JVM 为自己制定限制.
无需任何额外配置,JVM 会将最大堆大小设置为已分配内存的 25%。由于这很节俭,您可能希望通过设置 -XX:MaxRAMPercentage
属性来提高一点。此外,初始堆大小为 -XX:InitialRAMPercentage
,RAM 小于 96MB 的容器为 -XX:MinRAMPercentage
。
有关该主题的更多信息,here 是一个很好的概述。