你的项目如何检查OOM?
对于还在正常运行的系统?
1.可以通过jmap来查看JVM中各个区域的使用情况
2.jstack查看线程的运行情况,看那些线程阻塞,是不是出现了死锁
3.jstat看垃圾回收情况,如果full gc频繁,需要调优
4.通过这些命令的结果和jvisualvm(jvm性能检测工具)分析
5.如果full gc频繁发生但是没有内存溢出,那么表示fullgc实际上回收了很多对象了,所以这些对象最好在minor gc时回收掉,避免进入老年代,对于这种情况,考虑这些存活对象不长的对象是不是比较大,导致年轻代放不下,直接进入老年代,尝试加大年轻代大小,如果改完之后,fullgc减少,则证明修改有效
6.同时找到占用cpu最多的线程,定位到具体方法,优化这个方法的执行,看能否避免某些对象的创建,从而节省内存
如果已经发生了OOM?
设置参数
XX:HeapDumpOnOutOfMemoryError
XX:HeapDumpPath:/user/local/base当发生OOM自动dump堆内存信息到指定目录
使用MAT工具和dump文件,分析大对象的占用情况,比如HashMap做缓存未清理,时间长了内存会溢出,可以改为弱引用