1、GC overhead limit exceeded(第二次运行的时候,不报这个错误,直接显示redis连接失败,然后报错Java no Heap Space,其实原因还是一样的。后续大家遇到这种情况,可考虑gc过于频繁导致)
发生条件:
本地windows运行程序,jvm参数设置-Xms256m -Xmx256m
Jmeter访问接口并发100(可调节)
GC使用JDK8默认垃圾收集器---Parallel Scanvenge+Serial Old(Parallel Scanvenge+Parallel Old该组合也一样)
官方解释:JVM花费了98%的时间进行垃圾回收,而只得到2%可用的内存,频繁的进行内存回收(最起码已经进行了5次连续的垃圾回收),JVM就会曝出ava.lang.OutOfMemoryError: GC overhead limit exceeded错误
现象:程序不再执行(接口访问超时),通过jprofiler监控,GC率(不知该如何描述~)达到99.5%,内存接近最大值,但未溢出,CPU也很高,但未达到90%以上。
优化(还是要根据具体情况来采用):
(1) 增大内存;
(2)使用ParNew+CMS垃圾收集器或G1,100并发绰绰有余
(3)记录发生异常时,heap的情况(运行时增加-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/temp/heap.hprof),使用JProfiler分析,查看有什么对象占用较大,从而优化代码
举例:我的项目,一个数据库表对应的类对象比较大,分析代码发现,该方法获取了表中所有的数据,但实际只使用了两个字段,并发量上去后,就造成了内存的浪费,于是就修改了返回字段。100并发通过~