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

Tun*_*yen 31 java heap-memory docker

提出这个问题时,Docker看起来很新,不能在网上找到这个问题的答案.我找到的唯一一个地方就是这篇文章,其中作者说这很难,就是这样.

haw*_*eye 35

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

  environment:
  - JVM_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
Run Code Online (Sandbox Code Playgroud)

要么

  environment:
  - CATALINA_OPTS=-Xmx12g -Xms12g -XX:MaxPermSize=1024m
Run Code Online (Sandbox Code Playgroud)

  • 一年后,我实际上意识到 JVM_OPTS 对我的项目没有任何作用(OOM):)真正有效的是 _JAVA_OPTIONS (6认同)

jba*_*eta 34

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

docker run --rm -e JAVA_OPTS='-Xmx1g' tomcat
Run Code Online (Sandbox Code Playgroud)

请参见如何设置JVM参数?


occ*_*asl 13

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

ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以通过在 docker compose 文件中指定 java 选项环境来实现

env: 
  - name: _JAVA_OPTIONS
    value: "-Xmx1g"
Run Code Online (Sandbox Code Playgroud)

它会改变堆大小。


Fri*_*rdt 6

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

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

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

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


Mar*_*nor 5

这完全取决于您的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
Run Code Online (Sandbox Code Playgroud)