记录一次单线程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