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

问题描述 投票:0回答:8

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

java docker heap-memory
8个回答
57
投票

请注意,在

docker-compose.yml
文件中 - 您需要省略双引号:

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

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

49
投票

我同意这取决于您使用的容器。如果您使用官方的 Tomcat 映像,看起来很简单,您需要通过堆设置传递

JAVA_OPTS
环境变量:

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

参见如何设置JVM参数?


40
投票

更新:关于此讨论,Java 已经提升了有关容器支持的游戏。如今(或者更准确地说,从 JVM 版本 10 开始),JVM 足够智能,可以判断它是否在容器中运行,如果是,则它的内存限制是多少。

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

无需任何额外配置,JVM 会将最大堆大小设置为 已分配内存的 25% 。由于这是节俭的,您可能需要通过设置

-XX:MaxRAMPercentage
属性来稍微提高它。此外,还有
-XX:InitialRAMPercentage
表示初始堆大小,
-XX:MinRAMPercentage
表示内存小于 96MB 的容器。

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


21
投票

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

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

9
投票

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

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

它将改变堆大小。


6
投票

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

3
投票

您也可以使用以下方式在

dockerfile
中设置
Xms
Xmx 值。

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


0
投票

我这个问题有点晚了,我将使用@Fritz Duchardt 的答案。

但是如果有人正在努力并获得 “无效的初始堆大小”,那么 我们应该为 -Xms 和 -Xmx 设置两个单独的参数,如下所示:

"java","-Xms256m","-Xmx1G","-Dspring.profiles.active=${ENV}","-jar","app-0.0.1-SNAPSHOT.jar"
© www.soinside.com 2019 - 2024. All rights reserved.