为了账号安全,请及时绑定邮箱和手机立即绑定

tomcat 频繁触发full gc

tomcat 频繁触发full gc

慕婉清6462132 2019-02-19 07:21:20
服务器: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; } } }
查看完整描述

9 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-01
?
森林海

TA贡献2011条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-01
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-01
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

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

查看完整回答
反对 回复 2019-03-01
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

很低的可能性导致full gc的,以你的逻辑,每次500条的产生对象几乎引用范围在新生代就被回收掉了。

查看完整回答
反对 回复 2019-03-01
  • 9 回答
  • 0 关注
  • 804 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号