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

时间:2015-04-28 15:25:53

标签: java docker heap-memory

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

6 个答案:

答案 0 :(得分:31)

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

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

请参阅How to set JVM parameters?

答案 1 :(得分:27)

请注意,在pointer-events: none;文件中,您需要省略双引号:

docker-compose.yml

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

答案 2 :(得分:11)

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

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

答案 3 :(得分:5)

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

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

它将更改堆大小。

答案 4 :(得分:4)

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

答案 5 :(得分:0)

更新:关于此讨论,Java在那里增加了有关容器支持的游戏。如今(或者更确切地说是从JVM版本10开始), JVM足够聪明,可以确定它是否在容器中运行,如果可以,则可以确定它限于多少内存。

因此,不必在启动JVM时设置固定的限制,而是必须根据容器限制的更改(K8s世界中的资源限制)进行更改,而只需不执行任何操作并让JVM解决限制

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

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