首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

关于遍历大数据量数据库内存储器溢出

2013-07-04 
关于遍历大数据量数据库内存溢出public void batchUpdate(){//循环遍历所有INFOMATION_ARTICLEArticle art

关于遍历大数据量数据库内存溢出

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会启动,内存就不会有问题。


但可能存在这种情况,你的某一次循环内,batchList.clear()方法被调用前,内存已经不够了,比如有几个超大的Article对象,这个时候Article对象都是有引用的,GC启动了也无法清掉,这个时候会报内存溢出。
[解决办法]
看了下ArrayList最大存储内容好像是4G,是不是你的batchList内容存储的太大了
[解决办法]
换成LinkedList看行不行
[解决办法]

List<Word>?artWords?=?getWords(art.getId());?


这句把List<Word>?artWords 放到for循环外面吧,不然每循环一次,相当于多new一个对象
[解决办法]
你能不能不要什么都放在循环里做啊。

一个一个for按顺序来好吗。。。
[解决办法]
内存搞大点内存搞大点
[解决办法]
list = commonDao.queryForList("Article.getArticlePage", article); 
这个list用完后最好设成null,以便gc回收。
Article a = new Article();
这个a的创建最好要放到所有循环的外面,用完后设成null。
[解决办法]
引用:
Quote: 引用:

逻辑上没有问题,但是你的batchList是在每次循环末尾清掉的,这个时候如果内存稀缺,GC会启动,内存就不会有问题。
但可能存在这种情况,你的某一次循环内,batchList.clear()方法被调用前,内存已经不够了,比如有几个超大的Article对象,这个时候Article对象都是有引用的,GC启动了也无法清掉,这个时候会报内存溢出。



我把循环改成500也不行


你统计下,最大的500行数据的总大小,跟你的内存比较下。
[解决办法]
artWords.clear().

引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

逻辑上没有问题,但是你的batchList是在每次循环末尾清掉的,这个时候如果内存稀缺,GC会启动,内存就不会有问题。
但可能存在这种情况,你的某一次循环内,batchList.clear()方法被调用前,内存已经不够了,比如有几个超大的Article对象,这个时候Article对象都是有引用的,GC启动了也无法清掉,这个时候会报内存溢出。



我把循环改成500也不行


你统计下,最大的500行数据的总大小,跟你的内存比较下。


平均每1000条占3M

那就不是这个问题啊,内存那个循环,每次artWords用完了,artWords.clear()一下试试。
[解决办法]
用工具监控下吧 
[解决办法]
调整一下jdbc connection的fetchSize参数

热点排行