tomcat 频繁触发full gc

服务器:tomcat
简单描述:db中有460w+条记录,在@Service中,使用while true,一次从DAO层中select 出500条,逐条处理,处理完之后再select 出500条,直到select出来是空的list,就break;
问题:由于总共有460w条数据,还是逐条处理,所以程序跑了24小时都没有跑完,有没有可能出现full gc?如果出现full gc,原因可能是什么?
示意代码:

public void doProcess(){
        while (true){
            List<UserDTO> list = myDao.selectUserPage();
            if (list.size()>0){
                for (UserDTO userDTO:list){
                    //处理业务逻辑,每500条大致需要30多秒
                }
            }else {
                break;
            }
        }
    }
慕婉清6462132
浏览 805回答 9
9回答

撒科打诨

少年,我来给你做一道数学题,460w / 500 * 0.5分钟 / 60 = 76.67 小时,所以24小时没处理完是正常的。

森林海

如果不看你业务逻辑部分代码,单看你这段逻辑,理论上不会Full GC的(你的内存不至于连500条记录都存储不下的吧),当然,你的程序必须是单线程的,如果是多线程(而且线程数还比较高)则有可能。出于程序健壮性考虑,你的判断语句list.size() > 0最好能改成list != null && list.size() > 0。

慕码人8056858

最重要的是,数据库是本地还是跨网

米琪卡哇伊

还存在一个问题,如果处理能力能达到的话,查出来list若为空,list.size()这句是会报空指针异常的,所以为空判断应该放前面,为空则break。

呼啦一阵风

很低的可能性导致full gc的,以你的逻辑,每次500条的产生对象几乎引用范围在新生代就被回收掉了。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java