繁体   English   中英

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

[英]How to set Java heap size (Xms/Xmx) inside Docker container?

在提出这个问题时,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 参数?

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

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

这完全取决于您的 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 compose 文件中指定 java 选项环境来实现

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

它会改变堆大小。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM