對(duì)Docker中Spring Boot應(yīng)用的內(nèi)存分析 - 經(jīng)驗(yàn)教訓(xùn)(翻譯)

我有一個(gè)運(yùn)行嵌入式Tomcat服務(wù)器的Spring Boot應(yīng)用程序忍法,非常簡(jiǎn)單...
它運(yùn)行在一個(gè)Docker容器中讽营。 若我用$ docker run運(yùn)行鏡像(沒有內(nèi)存限制)蜗顽,它的資源占用情況是這樣:

docker stats

image.png

一個(gè)相當(dāng)簡(jiǎn)單的spring boot應(yīng)用的容器就占了677MB坞嘀? are you kidding me砚哆?開始挖掘真相吧...

首先,我需要看到容器中實(shí)際運(yùn)行的進(jìn)程混狠。

docker exec my-app top -m

image.png

啊哈岸霹! 有一個(gè)Gradle進(jìn)程正在運(yùn)行,它報(bào)告的RSS( Resident Set Size )與我們的Spring Boot應(yīng)用程序一樣大将饺。 看看Dockerfile贡避,很容易看出原因:

FROM anapsix/alpine-java:8_jdk

# Create app directory
RUN mkdir -p /app  
WORKDIR /app

# Bundle app source
COPY . /app

# Build the solution (using the gradle task)
RUN ./gradlew build

EXPOSE 8080

CMD ["./gradlew", "bootRun"] 

CMD使用gradle任務(wù)來運(yùn)行應(yīng)用程序。 gradle啟動(dòng)應(yīng)用程序后沒有退出予弧,它掛在了那里贸桶。

1 第一次優(yōu)化

所以,第一次內(nèi)存優(yōu)化的目的很簡(jiǎn)單 - 干掉Gradle過程桌肴! 我只需要從使用Gradle任務(wù)引導(dǎo)應(yīng)用程序改為直接使用Java執(zhí)行.jar文件皇筛。

CMD ["java", "-jar", "build/libs/{app name}.jar"]

現(xiàn)在讓我們看看容器中的top

image.png

Gradle進(jìn)程被干掉了! 我們削減了50%內(nèi)存消耗坠七。

2 第二次優(yōu)化

即使我對(duì)Spring和Java runtime不甚了解水醋,我仍然認(rèn)為我們可以做得更好。 一個(gè)沒有流量的簡(jiǎn)單API居然要382MB內(nèi)存彪置,...我們肯定錯(cuò)過了什么拄踪。

使用-Xmx56m指定運(yùn)行時(shí)的 heap size limit(堆棧大小) 拳魁。 我想每個(gè)Java開發(fā)人員都知道這一點(diǎn)惶桐。 將這個(gè)參數(shù)添加到我們的$ java -jar命令將會(huì)限制Java堆棧大小為56MB。 運(yùn)行時(shí)將嘗試通過運(yùn)行垃圾回收來保持它低于這個(gè)數(shù)字潘懊。要設(shè)置堆棧大小姚糊,我們可以在JAVA_OPTS環(huán)境變量設(shè)置Xmx參數(shù):

docker run -e "JAVA_OPTS=-Xmx52m" app-image

這就OK了嗎? 非也授舟!Java實(shí)際上忽略了我們的變量救恨,并啟用了默認(rèn)值。

其原因在于Spring Boot释树。 Spring Boot會(huì)將任何環(huán)境變量傳遞給應(yīng)用程序 - 但是我們的JAVA_OPTS并非是針對(duì)應(yīng)用程序的肠槽,而是針對(duì)Java runtime本身的。 所以我們需要使用$ JAVA_OPTS變量來 `exec java`奢啥。 這需要對(duì)Dockerfile進(jìn)行一些小改動(dòng):

ENTRYPOINT exec java $JAVA_OPTS -jar build/libs/{app name}.jar

我在命令中使用'exec'秸仙,以便它創(chuàng)建的子進(jìn)程替換主進(jìn)程。 保持容器整潔桩盲。

現(xiàn)在寂纪,當(dāng)我們運(yùn)行容器時(shí),$JAVA_OPTS被傳遞給runtime正驻,正如我們所料弊攘。 我們?cè)O(shè)置的其他任何環(huán)境變量當(dāng)然也可以被Spring Boot應(yīng)用拿到。

這使我們能夠按照自己的意思調(diào)優(yōu)Java姑曙。 以下是應(yīng)用-Xmx56m參數(shù)后的結(jié)果:

image.png

得到的教訓(xùn)

構(gòu)建工具

不要使用Gradle運(yùn)行應(yīng)用程序襟交。 它在開發(fā)過程中非常棒,但是Gradle進(jìn)程掛在那伤靠,占用了容器不少的內(nèi)存捣域。

JAVA_OPTS

我不太明白為什么我需要這樣做。 Spring Boot本身不是應(yīng)該優(yōu)化了效率和性能并且拆箱即用嗎宴合? 為什么我必須通過在堆棧上添加內(nèi)存限制來增加這個(gè)風(fēng)險(xiǎn) 焕梅? 或者更好的問題是:為什么默認(rèn)值想要這么多內(nèi)存? 我對(duì)JVM經(jīng)驗(yàn)缺乏阻止我回答這個(gè)問題卦洽!

英文原文:
Memory analysis of a Spring Boot application in docker - lessons learnt

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贞言,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子阀蒂,更是在濱河造成了極大的恐慌该窗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚤霞,死亡現(xiàn)場(chǎng)離奇詭異酗失,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昧绣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門规肴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夜畴,你說我怎么就攤上這事拖刃。” “怎么了贪绘?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵序调,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我兔簇,道長(zhǎng)发绢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任垄琐,我火速辦了婚禮边酒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狸窘。我一直安慰自己墩朦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布翻擒。 她就那樣靜靜地躺著氓涣,像睡著了一般牛哺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劳吠,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天引润,我揣著相機(jī)與錄音,去河邊找鬼痒玩。 笑死淳附,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蠢古。 我是一名探鬼主播奴曙,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼草讶!你這毒婦竟也來了洽糟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤堕战,失蹤者是張志新(化名)和其女友劉穎脊框,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體践啄,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浇雹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屿讽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昭灵。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伐谈,靈堂內(nèi)的尸體忽然破棺而出烂完,到底是詐尸還是另有隱情,我是刑警寧澤诵棵,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布抠蚣,位于F島的核電站,受9級(jí)特大地震影響履澳,放射性物質(zhì)發(fā)生泄漏嘶窄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一距贷、第九天 我趴在偏房一處隱蔽的房頂上張望柄冲。 院中可真熱鬧,春花似錦忠蝗、人聲如沸现横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戒祠。三九已至骇两,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間姜盈,已是汗流浹背低千。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贩据,地道東北人栋操。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓闸餐,卻偏偏與公主長(zhǎng)得像饱亮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舍沙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容