【问题标题】:Docker - Java container doesn't respect memory limitsDocker - Java 容器不遵守内存限制
【发布时间】:2020-02-03 03:41:12
【问题描述】:

我已经阅读了多篇关于限制容器的 JVM 内存的帖子,到目前为止没有任何效果,我不知道我在哪里搞砸了。

我在 Spring Boot 中做了一个简单的“Hello World”,使用 REST 控制器,它没有别的。

这样的应用程序被导出为 WAR 文件,使用 Tomcat JDK 11 映像运行它,我也可以使用带有 FatJar 的 JDK 映像运行它,但问题仍然存在。


预期

让我的 Java 容器占用的内存不超过 25 MB(为了一个数字,可能更多)

实际

这样一个简单的应用程序在docker stats 中占用 200 - 250 MB 内存


Dockerfile

FROM tomcat:9.0.30-jdk11-corretto
COPY tomcat.war /usr/local/tomcat/webapps/ROOT.war
CMD ["catalina.sh","run"]

docker-compose.yml

version: '3.7'

services:
    hello:
        build:
            context: .
            dockerfile: Dockerfile
        image: app-test
        environment:
            - JVM_OPTS=-Xms13m -Xmx25m
        ports:
            - 8080:8080

我试过了

-Xms13m -Xmx25m

-XX:PermSize=13m -XX:MaxPermSize=25m

在我已经删除并忘记的其他标志中

【问题讨论】:

  • -Xms13m -Xmx25m 仅适用于 JVM 内存,不适用于容器。
  • @KarthikeyanVaithilingam 哦,这是否意味着我的标志正在工作,但我还必须以另一种方式限制容器?
  • 我真的怀疑标准 JVM 会以如此有限的内存开始(除非您使用的是一些微型版本)。
  • @ElliottFrisch 这只是一个例子,对于一个简单的 Hello World 来说,250MB 不是太多了吗?我无法想象以这种方式设置多个微服务
  • 看看GraalVM(因此我的非标准评论)。

标签: java docker memory docker-compose jvm


【解决方案1】:

要限制 docker 容器的内存,您需要在 docker-compose.yml 文件中添加以下内容

environment:
  - <name>=<value>
deploy:
  resources:
    memory: 256M

添加上述代码后,容器将被限制为给定的内存限制,您可以在docker stats 输出中看到结果。有关资源限制的更多详细信息,请参阅this docker 文档。

注意:如果容器超过给定的内存限制,内核将杀死容器。

【讨论】:

  • 就是这样,我也把镜像改成openjdk 11 slim,效果确实不一样,Hello World只占用90M
  • @Jouo 我很高兴它有帮助。在 docker 中,明智地选择基础镜像很重要。
【解决方案2】:

tomcat 的 catalina.sh 脚本依赖于 java 选项的环境变量是:JAVA_OPTS。 如果您将撰写文件更改为使用以下环境变量,它应该可以工作。

environment: - JAVA_OPTS=-Xmx128m -Xms128m

除了 25m 似乎对于运行 tomcat 的 JVM 来说内存太少了。

【讨论】:

    【解决方案3】:

    无论您为 JVM 堆 (-Xmx) 设置了多少内存,JVM 使用许多其他类型的非堆内存:Java using much more memory than heap size (or size correctly Docker memory limit) - 您需要考虑到这一点。

    您也可以完全避免设置 -Xmx,而是利用 -XX:MaxRAMPercentage: Clarification of meaning new JVM memory parameters InitialRAMPercentage and MinRAMPercentage

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多