记录一次单线程GC超时的处理

在处理大量数据时遇到GC overhead limit exceeded错误,尝试分块、设置对象为null及调用System.gc()未见效。分析排除@Transaction注解影响后,采用多线程(10个线程)并行处理,通过Thread.join()确保顺序,成功避免了CPU利用率过高,解决了问题。
摘要由CSDN通过智能技术生成

记录一次单线程GC超时的处理


方法本身,是在一个单线程的接口A中,对1500条左右的数据,调用另外一个接口B,进行数据库的一系列写入操作,接口B逻辑比较复杂。

直接调用接口,发现大概处理到700条左右,就出现了GC overhead limit exceeded,尝试过把1500条数据,分成多块,每块单独调用接口,并且对结束时,已经失效的对象赋值为null,并调用一次System.gc(),但是效果并不理想,还是在800条左右就报了GC overhead limit exceeded,也考虑过是不是因为@Transaction注解导致事务管理的调用过程中,有对象的使用导致无法正常gc,但是去除了注解之后,并没有什么变化。

最后改成将1500条左右的数据,在多个线程中(本次处理使用了10个线程)进行单独的调用,定义新的线程,并且通过Thread.join()方法保证数据处理的顺序等同于串行,通过这个方式,调用接口之后,直到任务执行完成,服务器的CPU基本比较稳定,不再出现CPU利用率爆满的情况了。

		List<List<String>> partitions = Lists.partition(codes, 140);
        List<Thread> threads 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值