学习java 异常处理--GC overhead limit exceeded

 

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并发通过~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值