在提出这个问题时,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 参数?
更新:关于这个讨论,Java已经提高了关于容器支持的游戏。如今(或者更准确地说,从JVM版本10开始),JVM足够聪明,可以确定它是否在容器中运行,如果是,它被限制为多少内存。
因此,与其在启动 JVM 时设置固定限制,然后您必须根据容器限制(K8s 世界中的资源限制)的变化进行更改,不如什么都不做,让 JVM 自己制定限制。
在没有任何额外配置的情况下,JVM 会将最大堆大小设置为已分配内存的 25%。由于这是节俭的,您可能希望通过设置 -XX:MaxRAMPercentage
属性来增加一点。此外,初始堆大小也有-XX:InitialRAMPercentage
,RAM 小于 96MB 的容器也有-XX:MinRAMPercentage
。
有关该主题的更多信息,这里有一个很好的概述。
您也可以将这些设置放在映像中,以便在 Dockerfile 中存在类似以下内容的内容:
ENV JAVA_OPTS="-XX:PermSize=1024m -XX:MaxPermSize=512m"
在 docker 撰写文件中指定 Java 选项环境来实现
env:
- name: _JAVA_OPTIONS
value: "-Xmx1g"
它将更改堆大小。
这完全取决于您的 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
您也可以使用以下方式在 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