我已经读了很多关于限制容器的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
在我已经删除并忘记的其他标志中
为了限制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内存参数的含义