OutOfMemoryError:GC overhead limit exceeded
官方解释报错的原因为:JVM花费了98%的时间进行垃圾回收,而只得到2%可用的内存,频繁的进行内存回收(最起码已经进行了5次连续的垃圾回收),JVM就会曝出ava.lang.OutOfMemoryError: GC overhead limit exceeded错误。
查看报错日志信息
[DUBBO] Got unchecked and undeclared exception which called by 10.18.125.224. service: com.guazi.aftermarket.dubbo.crm.schedule.service.BusinessOpportunityTaskDubboService, method: queryTasksByCustomerId, exception: org.springframework.jdbc.UncategorizedSQLException:
### Error querying database. Cause: java.sql.SQLException: Error
### The error may exist in class path resource [mapping/OpportunityTaskMapper.xml]
### The error may involve com.guazi.aftermarket.crm.schedule.db.mapper.OpportunityTaskMapper.selectByExample-Inline
### The error occurred while setting parameters
定位到问题代码:该方法根据入参customerId查询数据库,做了判空处理。看到这块逻辑上是没问题的
查看kibana,sql查询日志,发现有大批量慢查询报错,入参大批量为customer_id = 0
[SQL耗时:11584ms],slow query error, sql = select XXX from XXX WHERE ( customer_id = 0 )]
因为该接口是dubbo接口,给其他服务提供的基础接口,从日志看出该接口的调用量比较大
接下来,分析该sql。使用explain,结果如下,发现涉及行数估计值为91万
虽然该表中customer_id是建有索引的,但是该方法未过滤customer_id 为0的情况。
将几十万条数据查询出来放在list中,存储在堆中,并且调用量较大。导致了OOM。