某日線上一個服務cpu突然升高仆潮,通過top -H命令查詢到是一個線程占用cpu很高,
使用jstat -gc <pid>查詢gc情況發(fā)現(xiàn)老年代使用量占滿友题,一直在進行full gc逝撬,基本可以斷定是由于這個原因?qū)е耤pu飆升。
需要找出老年代占滿的原因
通過jmap -histo:live pid | head -10 查詢當前線程在內(nèi)存堆中的對象前10個發(fā)現(xiàn)里面存在幾十萬個pojo實例
導出整個JVM 中內(nèi)存信息 jmap -dump:format=b,file=文件名 [pid]
使用MemoryAnalyzer導入文件后發(fā)現(xiàn)有內(nèi)存泄漏钱磅,發(fā)現(xiàn)有線程池占用大量內(nèi)存梦裂,查看詳情后發(fā)現(xiàn)阻塞隊列中存在上述pojo對象占用大量內(nèi)存
查看線程池代碼發(fā)現(xiàn)是因為線程池核心線程為1,導致大量請求積壓在阻塞隊列中盖淡,導致對面不能被回收年柠,占用老年代,
修改線程池參數(shù)禁舷,重新啟動服務觀察多天后未復現(xiàn)該問題彪杉。