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

Posted

技术标签:

【中文标题】如何在 Docker 容器中设置 Java 堆大小(Xms/Xmx)?【英文标题】:How to set Java heap size (Xms/Xmx) inside Docker container? 【发布时间】:2015-07-07 13:06:56 【问题描述】:

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

【问题讨论】:

【参考方案1】:

更新:关于本次讨论,Java 已经在容器支持方面进行了升级。现在(或者更准确地说,从 JVM 版本 10 开始),JVM 已经足够智能,可以判断它是否在容器中运行,如果是,它会限制多少内存。

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

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

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

【讨论】:

【参考方案2】:

您可以通过在 docker compose 文件中指定 java 选项环境来做到这一点

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

它会改变堆大小。

【讨论】:

【参考方案3】:

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

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

见How to set JVM parameters?

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

设置 CATALINA_OPTS 是个坏主意,它会破坏容器中默认设置的许多其他选项 1 年后我真正意识到 JVM_OPTS 对我的项目没有任何作用(得到 OOM):) 真正有效的是 _JAVA_OPTIONS JVM_OPTS 对我也不起作用,但 _JAVA_OPTIONS 起作用了。谢谢两位!【参考方案5】:

您也可以将这些设置放在您的镜像中,这样您的 Dockerfile 中就会存在如下内容:

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

【讨论】:

我很确定设置 JAVA_OPTS 环境变量只能在官方 Tomcat 映像中使用。如果您已经创建了自己的 Tomcat 映像(例如,通过使用 Ubuntu 基础并在构建过程中安装 Tomcat),它可能无法工作【参考方案6】:

这完全取决于您的 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

【讨论】:

以上是关于如何在 Docker 容器中设置 Java 堆大小(Xms/Xmx)?的主要内容,如果未能解决你的问题,请参考以下文章

在IDEA中设置Java的堆大小

如何在 GCP 中设置与 MongoDB Docker 容器的连接

如何在 docker 容器中设置 flask-socketio?

当在docker容器中设置php时,如何在vscode中设置php可执行路径php.validate.executablePath?

如何在 Docker 容器中设置静态 IP 地址?

如何在 Debian/Ubuntu Docker 容器中设置语言环境?