什么时候需要排查gc问题
我们遇到什么样的现象会怀疑gc有问题,进而优化呢?gc问题大体上可以分为两类:内存溢出、gc不健康。
内存溢出一般会借助dump文件进行查看,设置jvm参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/applogs/system/error.dump可以在发生oom时给出dump信息。有了dump信息可以使用MAT,Jprofile,jvisualvm 进行排查。
gc不健康主要表现在这么几个方面:young gc频繁或者不频繁,理想频率是5s一次,一次50ms以内。old gc理想频率是一天一次。这个参数根据应用的重要性、tps等会有不同的要求。例如我司的大多数RPC接口要求50ms以内响应,白天不允许发生full gc(发生full gc会stop the world,造成接口响应时间变长,容易引发短时间内大量接口超时。)
总结一下,当遇到OOM报错、服务有突刺、间歇性的超时等问题时,我们需要查看一下gc情况是否合理,即时调整。
gc不正常的原因
当发现gc情况跟我们上面说的指标不太一致时,可以尝试用这几个方面去分析原因。
young gc不正常原因一般是堆空间大小设置不合理,也有可能大对象直接进入老年代等。
old gc不正常可能原因有
1: Old 区内存不够;
2:元数据区内存不够;
3:System.gc();
4:jmap 或者 jcmd;
5:CMS Promotion failed 或者 concurrent m