日期:2014-05-18  浏览次数:20690 次

关于遍历大数据量数据库内存溢出
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);
}



1.上面一共有70w条数据,每行数据里存的是文章,所以数据比较大
2.每次遍历1000条去修改

为什么javaw.exe一直往上涨,遍历到1w的时候已经占1G内存了,请问代码哪里有问题,或者有什么好的建议?是gc回收的太慢了?
内存溢出

------解决方案--------------------
帮顶吧,代码要是让我写我估计也会这样写,不知道有没有更优化的写法。我前段时间遇到tomcat内存设置太低,导致内存溢出情况,后来修改后好了,你不妨试试。
------解决方案--------------------
batchList内容太多
------解决方案--------------------
这段代码本身没看出来什么问题,如果最终导致OOM的话,恐怕得在这段代码中的被调函数找找了。

或者用jvisualvm.exe跟踪下看看对象数量是哪些无法释放吧。
------解决方案--------------------
可能是对象没释放掉  
我前几天做一个解析E  文件的东西 结果  运行过后  程序不推出   

必须强制 system。exit
------解决方案--------------------
逻辑上没有问题,但是你的batchList是在每次循环末尾清掉的,这个时候如果内存稀缺,GC会启动,内存就不会有问题。