摘要:直接顯示了一個(gè)疑似內(nèi)存泄漏的問(wèn)題。然后分析文件給出的信息,發(fā)現(xiàn)一個(gè)叫的類(lèi)。文件里面說(shuō)的內(nèi)存泄漏的大概的意思就是說(shuō),這個(gè)類(lèi)里面的存放的東西太多了,爆掉了。修改了代碼將調(diào)用的地方改成了單例。修改完線上跑了一段日子,后來(lái)也沒(méi)有出現(xiàn)過(guò)這樣的問(wèn)題。
問(wèn)題描述:
????早上去公司上班,突然就郵件一直報(bào)警,接口報(bào)異常,然后去查服務(wù)器的運(yùn)行情況,發(fā)現(xiàn)java的cpu爆了.接著就開(kāi)始排查問(wèn)題
問(wèn)題解決過(guò)程:1.先服務(wù)器(centos7)上,使用了top和uptime命令,發(fā)現(xiàn)時(shí)java的cpu爆了,超過(guò)100%了,導(dǎo)致后續(xù)的服務(wù)無(wú)法正常提供;
2.調(diào)整了負(fù)載均衡,下掉了有問(wèn)題的那幾臺(tái)機(jī)器;
3.使用jps找到了運(yùn)行著的tomcat的pid,這里假設(shè)為10086;
4.使用jstat -gcutil 10086 500 10 (意思是對(duì)pid為10086的線程,每500ms顯示各分代的內(nèi)存使用情況), 這里給一下部分jvm的參數(shù)設(shè)置,如下:
可以看到對(duì)新生代使用的是ParNew收集器,對(duì)老年代使用的是CMS收集器,CMSInitiatingOccupancyFraction=80說(shuō)明當(dāng)使用率超過(guò)80%的時(shí)候觸發(fā)垃圾回收。然后發(fā)現(xiàn),線上老年代一直超過(guò)80%的使用率,幾乎一秒不到就進(jìn)行了一次FGC,這么頻繁的FGC導(dǎo)致了服務(wù)無(wú)法正常運(yùn)行;
5.使用jmap -histo 查看了是哪些對(duì)象的數(shù)量最多,如果參數(shù)是-histo:live的話(huà),會(huì)在進(jìn)行一次FGC后,顯示當(dāng)前的使用數(shù)量最多的實(shí)例。查看后發(fā)現(xiàn)有大量的ConcurrentHashMap的Node節(jié)點(diǎn)實(shí)例,于是去代碼中搜索使用到ConcurrentHashMap的地方,有好幾處使用比較頻繁的地方,看了代碼后分析,可能是圖片上傳,下載的問(wèn)題,但也不能斷定。
6.使用jmap -dump:format=b,file=/usr/local/tomcat/dump1將內(nèi)存的情況給拉下來(lái).如下:
文件生成后,將dump1放入到eclipse的mat中進(jìn)行分析。直接顯示了一個(gè)疑似內(nèi)存泄漏的問(wèn)題。然后分析dump文件給出的信息,發(fā)現(xiàn)一個(gè)叫IdleConnectionReaper的類(lèi)。dump文件里面說(shuō)的內(nèi)存泄漏的大概的意思就是說(shuō),IdleConnectionReaper這個(gè)類(lèi)里面的ArrayList存放的東西太多了,爆掉了。如下:
從oss的jar包里面找到這個(gè)類(lèi)以后,簡(jiǎn)單的看一下這個(gè)類(lèi)的構(gòu)成,如下:
通過(guò)查找一些官方的資料和源代碼的閱讀,發(fā)現(xiàn)這個(gè)是一個(gè)oss的守護(hù)線程,用來(lái)檢測(cè)上傳或者下載的工作線程,每60秒就會(huì)去檢查一下空閑的工作線程,并且將它們回收。然后它內(nèi)部有一個(gè)靜態(tài)的ArrayList,里面保存的是ossClient的鏈接,默認(rèn)是1024個(gè)。
7.所以大概原因找到了,就是ossClient的鏈接太多了,扛不住了,所以一直在進(jìn)行FGC,導(dǎo)致服務(wù)不可用了,最后找到相關(guān)的代碼,發(fā)現(xiàn)有個(gè)小方法里面在每次上傳或者下載的時(shí)候,都會(huì)去創(chuàng)建一個(gè)ossClient。修改了代碼將ossClient調(diào)用的地方改成了單例。修改完線上跑了一段日子,后來(lái)也沒(méi)有出現(xiàn)過(guò)這樣的問(wèn)題。
1.大量的請(qǐng)求,調(diào)用的地方要注意是否會(huì)導(dǎo)致內(nèi)存的大量消耗,盡可能使用池化技術(shù),單例等,減少創(chuàng)建,銷(xiāo)毀的系統(tǒng)開(kāi)銷(xiāo);
2.CMS 的幾個(gè)缺點(diǎn),可以參考《深入java虛擬機(jī)》,對(duì)CPU占用會(huì)比較高,無(wú)法處理浮動(dòng)垃圾,還有就是CMS使用的是標(biāo)記-清除算法,會(huì)導(dǎo)致大量的空間碎片,碎片過(guò)多的話(huà),導(dǎo)致分配大對(duì)象很困難,所以不得不進(jìn)行FGC,也可能是這個(gè)原因?qū)е铝吮疚恼f(shuō)的一直FGC的問(wèn)題。解決方式:
-XX:+UseCMSCompactAtFullCollection:使用并發(fā)收集器時(shí),開(kāi)啟對(duì)年老代的壓縮(會(huì)整理內(nèi)存碎片,默認(rèn)是開(kāi)啟的);
-XX:CMSFullGCsBeforeCompaction=0:上面配置開(kāi)啟的情況下,這里設(shè)置多少次Full GC后,對(duì)年老代進(jìn)行壓縮,會(huì)使得FGC的時(shí)間變長(zhǎng),但是可以提升內(nèi)存空間的使用率,讓大對(duì)象可以更容易分配,而不需要多次FGC。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73635.html
摘要:現(xiàn)象登入生產(chǎn)環(huán)境,使用命令因?yàn)檫@時(shí)候并沒(méi)有打的,所以只能觀察現(xiàn)象。其他的可以根據(jù)這個(gè)類(lèi)推,是內(nèi)純的占用量。 前言 我們的游戲上線之初,經(jīng)常有玩家反饋卡,或者有網(wǎng)絡(luò)延遲等現(xiàn)象,造成用戶(hù)流失等現(xiàn)象,這時(shí)候我就想到是不是可能是之前的jvm配置有問(wèn)題,或者存在內(nèi)存泄露等問(wèn)題。 現(xiàn)象 登入生產(chǎn)環(huán)境,使用命令,因?yàn)檫@時(shí)候并沒(méi)有打gc的log,所以只能觀察現(xiàn)象。 jstat -gcutil 270...
摘要:?jiǎn)栴}線上定時(shí)任務(wù)計(jì)算出的金額不對(duì)定位問(wèn)題查看日志好像也執(zhí)行了但是金額為什么和數(shù)據(jù)庫(kù)的表里的不一致再查整個(gè)的定時(shí)任務(wù)日志日切日期 問(wèn)題: 線上riskProvision定時(shí)任務(wù),計(jì)算出的金額不對(duì) 定位問(wèn)題: 查看日志 4.13 riskProvision 2017-04-13 01:10:00.009 [org.springframework.scheduling.quartz....
摘要:并且在對(duì)的抽象中,每一行,每一個(gè)單元格都是一個(gè)對(duì)象。對(duì)支持使用官方例子需要繼承,覆蓋方法,每讀取到一個(gè)單元格的數(shù)據(jù)則會(huì)回調(diào)次方法。概要Java對(duì)Excel的操作一般都是用POI,但是數(shù)據(jù)量大的話(huà)可能會(huì)導(dǎo)致頻繁的FGC或OOM,這篇文章跟大家說(shuō)下如果避免踩POI的坑,以及分別對(duì)于xls和xlsx文件怎么優(yōu)化大批量數(shù)據(jù)的導(dǎo)入和導(dǎo)出。一次線上問(wèn)題這是一次線上的問(wèn)題,因?yàn)橐粋€(gè)大數(shù)據(jù)量的Excel導(dǎo)出...
摘要:直到有一天你會(huì)碰到線上奇奇怪怪的問(wèn)題,如線程執(zhí)行一個(gè)任務(wù)遲遲沒(méi)有返回,應(yīng)用假死。正好這次借助之前的一次生產(chǎn)問(wèn)題來(lái)聊聊如何排查和解決問(wèn)題。本地模擬上文介紹的是線程相關(guān)問(wèn)題,現(xiàn)在來(lái)分析下內(nèi)存的問(wèn)題。盡可能的減少多線程競(jìng)爭(zhēng)鎖。 showImg(https://segmentfault.com/img/remote/1460000015568421?w=2048&h=1150); 前言 之前或...
閱讀 3491·2021-09-22 16:00
閱讀 3575·2021-09-07 10:26
閱讀 3153·2019-08-30 15:55
閱讀 2924·2019-08-30 13:48
閱讀 1418·2019-08-30 12:58
閱讀 2238·2019-08-30 11:15
閱讀 1034·2019-08-30 11:08
閱讀 623·2019-08-29 18:41