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

vdzxcuhz  于 2023-03-22  发布在  Docker
关注(0)|答案(7)|浏览(713)

在提出这个问题时,Docker看起来足够新,在网上没有这个问题的答案。我发现的唯一地方是this article,作者说它很难,就是这样。

vojdkbi0

vojdkbi01#

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

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

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

bnl4lu3b2#

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

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

参见How to set JVM parameters?

56lgkhnf

56lgkhnf3#

**更新:**关于这个讨论,Java在容器支持方面已经有了很大的进步。现在(或者更准确地说,从JVM版本10开始),JVM已经足够聪明,可以判断它是否在容器中运行,如果是,它的内存限制是多少。

因此,与其在启动JVM时设置固定的限制,然后您必须根据容器限制(K8s世界中的资源限制)的变化进行更改,不如简单地什么都不做,让JVM为自己制定限制
在没有任何额外配置的情况下,JVM会将最大堆大小设置为已分配内存的25%。由于这是节约的,您可能希望通过设置-XX:MaxRAMPercentage属性来增加一点。此外,初始堆大小为-XX:InitialRAMPercentage,内存小于96MB的容器为-XX:MinRAMPercentage

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

hl0ma9xz

hl0ma9xz4#

你也可以把这些设置放在你的镜像中,这样你的Dockerfile中就会有如下内容:

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

j0pj023g5#

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

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

它将改变堆大小。

xurqigkl

xurqigkl6#

这完全取决于Java应用程序是如何打包的,以及它的配置文件是如何使用Docker公开的。
例如,official tomcat image声明配置文件在默认位置可用:/usr/本地/Tomcat/配置文件/
所以很容易覆盖整个目录或只是一个配置文件:

docker run -it --rm -p 8080:8080 -v $PWD/catalina.properties:/usr/local/tomcat/conf/catalina.properties tomcat:8.0
2ul0zpep

2ul0zpep7#

您也可以通过以下方式在dockerfile中设置XmsXmx的值:

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

相关问题