減少Spring Boot的JVM記憶體佔用的Docker三種配置

banq發表於2019-04-13

該文提出了減少Spring Boot減少JVM佔用的三種Dockerfile映象配置:

  • OpenJ9:取代Hotspot的IBM Eclipse專案。它已經被開發很長一段時間,看起來已經足夠成熟,可以用於生產。您可以立即輕鬆地獲益,替換一些基本映象和一些引數可能足以為您的應用程式提供巨大的推動力 - 我已經通過更改 Dockerfile基本映像替換了一些應用程式,節約了大約 1/3的記憶體佔用,增強了吞吐量。

    FROM adoptopenjdk/openjdk8-openj9:alpine-slim
    COPY target/app.jar /my-app/app.jar
    ENTRYPOINT java $JAVA_OPTS -Xshareclasses -Xquickstart -jar /my-app/app.jar
    

  • GraalVM:圍繞這個由Oracle實驗室開發的有前途的虛擬機器進行了大量宣傳。它為您提供了將應用程式編譯為本機映象的選項,生成映象非常非常快且記憶體消耗很少,吸引人眼球的另一個功能是能夠與多種語言(如Javascript,Ruby,Python和Java)進行互動操作。

    FROM oracle/graalvm-ce:1.0.0-rc15
    COPY target/app.jar /my-app/app.jar
    ENTRYPOINT java $JAVA_OPTS -jar /my-app/app.jar
    

  • Fabric8 shell:一個bash指令碼,可根據應用程式當前執行環境自動為您配置JVM引數。它可以在這裡下載,是這個研究專案的產物。它降低了不少記憶體:

    FROM java:openjdk-8-alpine
    COPY target/app.jar /my-app/app.jar
    COPY run-java.sh /my-app/run-java.sh
    ENTRYPOINT JAVA_OPTIONS=${JAVA_OPTS} JAVA_APP_JAR=/my-app/app.jar /my-app/run-java.sh
    

雖然我們在應用解決方案時總是需要考慮上下文,但對我來說,獲勝者是OpenJ9,從而以最少的配置實現了生產就緒的效能和記憶體佔用。

雖然仍然沒有找到使用不合適的情況,但這並不意味著它將成為一個銀彈解決方案,請記住,最好是測試替代品,看看哪種更適合您的需求。

為什麼不用GraalVM?

GraalVM是一個偉大的專案,在接下來的幾個月裡也許它能顛覆讓本文的結論,但到目前為止,我發現了一些不能讓我想在生產中使用它的東西,特別是Spring Boot。

  • 不是GA - 目前正在釋出candidate 15版本
  • 對於沒有函式bean定義的Spring Boot,本機映象仍然無法正常執行
  • 正確構建本機映象需要做更多的工作
  • 原生映象速度非常快,但您必須考慮丟失一些JVM功能

相關文章