docker ps | grep myImageName(或docker ps | grep java)
docker exec -it containerId sh
top
可看到基本的容器占用的信息:pid、vsz、cpu、command等。(ctrl+c 或 q,退出top)
top -m
其中,vsz:Virtual Memory Size,虛擬內存大小,表明了該進(jìn)程可以訪(fǎng)問(wèn)的所有內存,包括被交換的內存和共享庫內存。
rss: Resident Set Size,常駐內存集合大小,表示進(jìn)程在RAM中占用了多少內存,并不包含在SWAP中占用的虛擬內存。即使是在內存中的使用了共享庫的內存大小也一并計算在內,包含了完整的在stack和heap中的內存。
SHR:shared memory,共享內存。
補充:
ps -ef | grep java 或 docker top 容器id ,可查看pid的一些信息。
ps aux | grep java。
top -p pid。
RSS
是常駐內存集(Resident Set Size),表示該進(jìn)程分配的內存大小。
RSS
不包括進(jìn)入交換分區的內存。
RSS
包括共享庫占用的內存(只要共享庫在內存中)
RSS
包括所有分配的棧內存和堆內存。
VSZ
表示進(jìn)程分配的虛擬內存。
VSZ
包括進(jìn)程可以訪(fǎng)問(wèn)的所有內存,包括進(jìn)入交換分區的內容,以及共享庫占用的內存。
VSZRW:未百度到具體含義,猜測:初始申請的虛擬內存大小。
docker stats 容器名 或 docker stats 容器id,結果如下:
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
補充:docker容器化下的JVM參數調優(yōu)
跑在docker容器的Java服務(wù)發(fā)生過(guò)幾次內存超標異常,實(shí)際上這和Java程序的docker容器化有很大的關(guān)系。Java和docker并不是天然的朋友,docker可以設置內存和CPU限制,底層通過(guò)Linux cgroup技術(shù)實(shí)現,但是Java JVM并不能自動(dòng)檢測到。
我們可以使用Java的Xmx標識手動(dòng)指定堆內存的大小或者使用較高版本的JDK提供的JVM標識,解決這個(gè)問(wèn)題。
舊版本Java8(update 131之前的版本),JVM的可用內存和CPU數量并不是docker允許你使用的可用內存和CPU數量
比如docker容器中限制只能使用1G,但是舊版本Java并不能識別到這個(gè)限制,當業(yè)務(wù)增長(cháng)時(shí),JVM就會(huì )申請更多內存,可能遠超這個(gè)限制。但是如果使用太多內存,docker就會(huì )采取行動(dòng)并殺死容器內的Java進(jìn)程,顯然這不是我們想要的!
目前我們生產(chǎn)環(huán)境使用Java8版本,這個(gè)問(wèn)題可通過(guò)-Xmx限制堆內存大小來(lái)解決,不過(guò)這里實(shí)際限制了兩次,一次是docker容器的內存限制,一次是jvm堆內存的限制。
這個(gè)前提需要Java程序的dockerfile支持:
# 初始鏡像 FROM adoptopenjdk/openjdk8 # jar包名字需要更改為項目名字-版本號,后面app.jar 不變 ADD example-sun-1.0.jar app.jar # 配置JVM啟動(dòng)參數 ENV JVM_ARGS=${JVM_ARGS} EXPOSE 8080 # 優(yōu)化jvm參數配置啟動(dòng) ENTRYPOINT java ${JVM_ARGS} -Djava.security.egd=file:/dev/./urandom -jar app.jar
具體在k8s deployment.yaml 部署文件中環(huán)境變量 env 中加入以下參數,當JVM 啟動(dòng)時(shí)就會(huì )加載進(jìn)去
- name: JVM_ARGS value: -Xmx1024m -Xms512m
Xmx1024m #設置jvm堆內存的最大值
-Xms512m #設置jvm堆內存的最小值
這里設置最小堆內存為512m,最大內存為1024m, 堆內存調整不要一味簡(jiǎn)單增大,要仔細分析內存占用過(guò)大的原因,是否有代碼上的問(wèn)題。
較高版本Java9之后(8u131+)JVM提供更好的解決方式
使用JVM 標志: -XX:+UnlockExperimentalVMOptions-XX:+UseCGroupMemoryLimitForHeap
強制JVM檢查L(cháng)inux的cgoup配置,實(shí)際上docker正是通過(guò)Linux的cgroup技術(shù)來(lái)限制容器的內存等資源的?,F在如果應用達到了docker設置的限制(比如1G),JVM是可以看到這個(gè)限制的,JVM就會(huì )嘗試GC操作。
如果gc之后仍然超過(guò)內存限制,那JVM就會(huì )做它該做的事情,比如拋出OutOfMemoryException.也就是說(shuō),JVM能夠識別到docker的這些設置。
程序運行過(guò)程中,也可以打印GC日志,方便排查問(wèn)題, 同時(shí)當Java發(fā)生OutOfMemory 異常時(shí)可將heap 內存 dump 下來(lái)方便我們排查問(wèn)題使用,設置以下參數:
- name: JVM_ARGS value: -Xmx1536m -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/my-heap-dump.hprof -Xloggc:/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
參數含義:
# 發(fā)生內存溢出自動(dòng)dump內存文件 -XX:+HeapDumpOnOutOfMemoryError ############ 指定dump文件地址為服務(wù)打印日志文件夾/logs(已掛載) -XX:HeapDumpPath=/logs/my-heap-dump.hprof ############ 打印服務(wù)gc日志 -Xloggc:/logs/gc.log # 輸出詳細GC日志 -XX:+PrintGCDetails # 格式化輸出時(shí)間戳 2020-09-17T19:45:05.680+0800 -XX:+PrintGCDateStamps
以上為個(gè)人經(jīng)驗,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站