关于遍历大数据量数据库内存溢出
public void batchUpdate(){
//循环遍历所有INFOMATION_ARTICLE
Article article = new Article();
List<Article> batchList= new ArrayList<Article>();
String content=null;
List<Article> list= new ArrayList<Article>();
for(int i=0;i<700;i++){
article.setStartRow(i*1000);
article.setEndRow((i+1)*1000);
list = commonDao.queryForList("Article.getArticlePage", article);
for (Article art : list) {
content = art.getArticleContent();
int cou = 1;
List<Word> artWords = getWords(art.getId());
for (Word word : artWords) {
if (cou++ > 10) {
break;
}
try {
content=content.replace(word.getUrl(), word.getWordName());//去掉标签
content=content.replaceFirst(word.getWordName(), word.getUrl());//替换第一个
} catch (Exception e) {
}
}
Article a = new Article();
a.setId(art.getId());
a.setArticleContent(content);
batchList.add(a);
}
commonDao.batchUpdate("Article.update", batchList);
batchList.clear();
System.out.println(i);
}
但可能存在这种情况,你的某一次循环内,batchList.clear()方法被调用前,内存已经不够了,比如有几个超大的Article对象,这个时候Article对象都是有引用的,GC启动了也无法清掉,这个时候会报内存溢出。
[解决办法]
看了下ArrayList最大存储内容好像是4G,是不是你的batchList内容存储的太大了
[解决办法]
换成LinkedList看行不行
[解决办法]
List<Word>?artWords?=?getWords(art.getId());?
逻辑上没有问题,但是你的batchList是在每次循环末尾清掉的,这个时候如果内存稀缺,GC会启动,内存就不会有问题。
但可能存在这种情况,你的某一次循环内,batchList.clear()方法被调用前,内存已经不够了,比如有几个超大的Article对象,这个时候Article对象都是有引用的,GC启动了也无法清掉,这个时候会报内存溢出。
我把循环改成500也不行
你统计下,最大的500行数据的总大小,跟你的内存比较下。
平均每1000条占3M