【現(xiàn)象】
應(yīng)用部署實例域慷,通過top命令查看褂痰,cpu消耗在6%到13%兼搏,但RES常駐內(nèi)存(不包括swap out)持續(xù)推高迅速達(dá)到1.9G,該docker容器的物理內(nèi)存為2G连霉,意味著應(yīng)用實例消耗完物理內(nèi)存榴芳。
VIRT虛擬內(nèi)存達(dá)到23G,VIRT包括進(jìn)程使用的庫跺撼、代碼窟感、數(shù)據(jù)等,而且暫不知道VIRT是指的宿主機(jī)全體還是當(dāng)前應(yīng)用進(jìn)程的量歉井。
VIRT:進(jìn)程使用的虛擬內(nèi)存柿祈。進(jìn)程使用的虛擬內(nèi)存總量,單位kb哩至。VIRT = swap + RES躏嚎。
swap交換區(qū)(磁盤虛擬內(nèi)存)約800m被持續(xù)的used,free持續(xù)減小到0后used清零菩貌,然后重復(fù)循環(huán)卢佣, 說明內(nèi)核在不斷進(jìn)行內(nèi)存和swap的數(shù)據(jù)交換,這是真正的內(nèi)存不夠用了箭阶。但不知道used達(dá)到800m被清零時虚茶,jiayu進(jìn)程有沒有full gc。
通過jstate -gcutil查看應(yīng)用進(jìn)程共計4次full gc仇参。
通過jmap -dump存活堆內(nèi)存快照媳危,堆內(nèi)存活對象總計只有100m。
【原因】
應(yīng)用進(jìn)程冈敛,啟動參數(shù)沒有設(shè)置堆內(nèi)存大小-Xms和-Xmx待笑,Xms默認(rèn)為64m,所以當(dāng)64m翻倍再翻倍時抓谴,會觸發(fā)full gc也就是看到的4次暮蹂。但分配達(dá)到2G之后無法分配,但進(jìn)程沒有設(shè)置Xmx所以無法觸發(fā)堆內(nèi)存滿多少時full gc的閾值癌压。所以此時堆內(nèi)存實際存活對象只有100m仰泻,其余1.8G都是可回收部分,也不會發(fā)起full gc去回收滩届。