簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM