早上和同事聊了下頻繁發(fā)生Full GC要怎么處理,記一下吧
什么時(shí)候會(huì)觸發(fā)Full GC
- 老年代空間不夠用了
- System.gc調(diào)用
- 統(tǒng)計(jì)新生代對(duì)象晉升到老年代的時(shí)候,發(fā)生要晉升的對(duì)象大于老年代的剩余空間
- 堆中分配大對(duì)象,直接分配到老年代,老年代也沒(méi)有連續(xù)的空間存放大對(duì)象
方案
- 可以先看看GC日志,或者用jstat打印gc信息,可能出現(xiàn)新生代的對(duì)象一直沒(méi)有釋放導(dǎo)致的
- 使用jmap把內(nèi)存中的對(duì)象dump下來(lái),用mat(eclipse的開源工具)或者jvisualvm(jdk自帶的工具)分析
- 可能出現(xiàn)jmap導(dǎo)出文件的時(shí)候,進(jìn)程卡死,文件太大,導(dǎo)不出來(lái)了,那就只好重啟了。
- 頻繁發(fā)生Full GC可能會(huì)導(dǎo)致CPU飆高,也可以配合jstack查看里面的線程到底在做什么
參考:Java命令行監(jiān)控工具(jmap,jstack,jstat,jinfo,jps)
最后
閑聊