[英]Docker - Java container doesn't respect memory limits
我一直在閱讀有關限制容器的 JVM 內存的多篇文章,到目前為止沒有任何效果,我不知道我在哪里搞砸了。
我在 Spring Boot 中制作了一個簡單的“Hello World”,使用 REST 控制器,它沒有別的。
此類應用程序被導出為 WAR 文件,使用 Tomcat JDK 11 映像運行它,我也可以使用具有 FatJar 的 JDK 映像運行它,但無論哪種方式,問題仍然存在。
預期的
讓我的 Java 容器占用的內存不超過 25 MB(為了數量,可以更多)
實際的
這樣一個簡單的應用程序在docker stats
占用了 200 - 250 MB 內存
文件
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
在我已經刪除並忘記的其他標志中
要限制 docker 容器的內存,您需要在 docker-compose.yml 文件中添加以下內容
environment:
- <name>=<value>
deploy:
resources:
memory: 256M
添加上述代碼后,容器將被限制為給定的內存限制,您可以在docker stats
輸出中看到結果。 有關資源限制的更多詳細信息,請參閱此docker 文檔。
注意:如果容器超過給定的內存限制,內核將殺死容器。
tomcat 的 catalina.sh 腳本的 java 選項依賴的環境變量是:JAVA_OPTS。 如果您更改撰寫文件以使用以下環境變量,它應該可以工作。
environment: - JAVA_OPTS=-Xmx128m -Xms128m
除了對於運行 tomcat 的 JVM 來說,25m 的內存似乎太少了這一事實。
無論您為 JVM 堆 (-Xmx) 設置的內存有多少,JVM 還使用許多其他類型的非堆內存: Java 使用的內存比堆大小(或正確大小的 Docker 內存限制)多得多- 您需要采取考慮到這一點。
您還可以完全避免設置 -Xmx,而是利用 -XX:MaxRAMPercentage: 新 JVM 內存參數 InitialRAMPercentage 和 MinRAMPercentage 含義的澄清
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.