提问者:小点点

Docker-Java容器不遵守内存限制


我已经读了很多关于限制容器的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

-二十: PermSize=13m-XX:最大PermSize=25m

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


共3个答案

匿名用户

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

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

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

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

匿名用户

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

环境:JAVA_OPTS=-Xmx128m-Xms128m

除了25m对于运行tomcat的JVM来说似乎内存太少这一事实之外。

匿名用户

无论您为 JVM 堆 (-Xmx) 设置了多少内存,JVM 都使用许多其他类型的非堆内存:Java 使用的内存比堆大小(或正确的大小 Docker 内存限制)多得多 - 您需要考虑到这一点。

您还可以完全避免设置-Xmx,而是利用-XX: MaxRAM百分比:澄清新JVM内存参数的含义