早上和同事聊了下频繁发生Full GC要怎么处理,记一下吧
什么时候会触发Full GC
- 老年代空间不够用了
- System.gc调用
- 统计新生代对象晋升到老年代的时候,发生要晋升的对象大于老年代的剩余空间
- 堆中分配大对象,直接分配到老年代,老年代也没有连续的空间存放大对象
方案
- 可以先看看GC日志,或者用jstat打印gc信息,可能出现新生代的对象一直没有释放导致的
- 使用jmap把内存中的对象dump下来,用mat(eclipse的开源工具)或者jvisualvm(jdk自带的工具)分析
- 可能出现jmap导出文件的时候,进程卡死,文件太大,导不出来了,那就只好重启了。
- 频繁发生Full GC可能会导致CPU飙高,也可以配合jstack查看里面的线程到底在做什么
参考:Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)
最后
闲聊