2007-10-31
不解的内存泄露(2)
因为前面一个星期回家看病(都是coding)惹得祸 所以一直没上线
所以前面的帖子就没看
当然问题也没解决 http://www.javaeye.com/post/400274
有朋友说MD5有问题 我觉得没有阿 还是贴下保险
从jprofile的截图来看
内存的占用集中在Page类的parseHyberlinks方法里面 而且是String没有释放
parseHyberlink方法见前贴
整个程序的开始
是从
开始
而在FetchWeb().fetch()中又调用了
这个地方的程序有点逻辑不清 主要是当时匆匆忙忙做得 本想测试通过了在改 。。。
addUrl的程序在前帖有
我是这样想的 java的内存回收有点像重力场一样 对象没有东西引用了才会回收 但是jprofile的图显示从程序入口开始就一直占着内存 以至于我不能判断出到底是那出错了
最初的判断是从parseHyberlink开始 返回一个url的集合然后将其加入没有访问的url集合,可能就是在这个过程中哪边的String引用没有释放
可能是在addurl()中 或者其他?
我计算了下当时没访问的url的集合中共有100000个数量级的字段 一个字段估计是60个byte 一起就是大约10M数量级
当时已经下载了200M左右的网页数据
但是300min内就泄露了大概70M内存?到底是什么泄露了?由于parseHyberlink方法中一开始得出的link并不是都会加到集合中 而是必须是一个有效的url才行 这样的话 可能也许原始的links会有70M?
S H I T
所以前面的帖子就没看
当然问题也没解决 http://www.javaeye.com/post/400274
有朋友说MD5有问题 我觉得没有阿 还是贴下保险
/**
* @functionName: generateMD5
* @description: generate the MD5 digest from 16 byte int to the ASCII format
* @version: 1.0
* @beCareful:16 byte int -> 32 byte ASCII
* @param source
* @return String the 32 byte ASCII MD5
*/
public static String generateMD5(String source)
{
byte[] bSource = source.getBytes();
MessageDigest md = null;
try
{
md = MessageDigest.getInstance("MD5");
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
byte[] md5 = md.digest(bSource);
StringBuffer buff = new StringBuffer();
for(int i = 0; i < md5.length; i++)
{
String byteStr = Integer.toHexString(md5[i] & 0xFF);
if(byteStr.length() < 2) buff.append('0');
buff.append(byteStr);
}
return buff.toString();
}
从jprofile的截图来看
内存的占用集中在Page类的parseHyberlinks方法里面 而且是String没有释放
parseHyberlink方法见前贴
整个程序的开始
是从
private void fetch()
{
while(true)
{
try
{
new FetchWeb().fetch();
}
catch (URISyntaxException e)
{
Log4j.logger.debug(e);
e.printStackTrace();
}
}
}
开始
而在FetchWeb().fetch()中又调用了
public void fetch() throws URISyntaxException
{
String iteratorHashSetUvUrlsNext=UrlDB.pickUrl();
System.out.println("the url we pick: " + iteratorHashSetUvUrlsNext);
WebPageProcessFace tryit = new WebPageProcessFace(iteratorHashSetUvUrlsNext);
try
{
if(tryit.doSomething())
{
//问题会不会这?
if(UrlDB.addUrl(iteratorHashSetUvUrlsNext, tryit.getLinks()))
Log4j.logger.info("addurl ok");
tryit = null;
}
else
{
tryit = null;
}
}
catch (IOException e)
{
tryit = null;
e.printStackTrace();
Log4j.logger.debug(e);
}
tryit = null;
Log4j.logger.info("\n");
Log4j.logger.info("\n");
}
这个地方的程序有点逻辑不清 主要是当时匆匆忙忙做得 本想测试通过了在改 。。。
addUrl的程序在前帖有
我是这样想的 java的内存回收有点像重力场一样 对象没有东西引用了才会回收 但是jprofile的图显示从程序入口开始就一直占着内存 以至于我不能判断出到底是那出错了
最初的判断是从parseHyberlink开始 返回一个url的集合然后将其加入没有访问的url集合,可能就是在这个过程中哪边的String引用没有释放
可能是在addurl()中 或者其他?
我计算了下当时没访问的url的集合中共有100000个数量级的字段 一个字段估计是60个byte 一起就是大约10M数量级
当时已经下载了200M左右的网页数据
但是300min内就泄露了大概70M内存?到底是什么泄露了?由于parseHyberlink方法中一开始得出的link并不是都会加到集合中 而是必须是一个有效的url才行 这样的话 可能也许原始的links会有70M?
S H I T
评论
Autinhorse
2008-06-09
我在做一个Spider的时候,也是发现内存泄露问题。
困扰了我两个星期,后来发现是Java的String的subString引起的。从一个非常大的String(比如网页的全部内容)取得一个哪怕一个字节的小String,整个原始String都不会被释放。久而久之,内存占用就到了一个非常大的程度。
我写了一篇文章总结这个问题。
http://www.baizeju.com/html/Java/200806/06-66.html
困扰了我两个星期,后来发现是Java的String的subString引起的。从一个非常大的String(比如网页的全部内容)取得一个哪怕一个字节的小String,整个原始String都不会被释放。久而久之,内存占用就到了一个非常大的程度。
我写了一篇文章总结这个问题。
http://www.baizeju.com/html/Java/200806/06-66.html
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 2468 次
- 性别:

- 来自: 南京

- 详细资料
搜索本博客
最新评论
-
不解的内存泄露
楼主解决了吗?
-- by jems -
不解的内存泄露(2)
我在做一个Spider的时候,也是发现内存泄露问题。 困扰了我两个星期,后来发现 ...
-- by Autinhorse -
不解的内存泄露
我在做一个Spider的时候,也是发现内存泄露问题。 困扰了我两个星期,后来发现 ...
-- by Autinhorse -
很希望这个版的事实版主来 ...
waldenlake 写道ywlqi 写道应届生有如此经历暴强了,不知道实际怎样 ...
-- by ywlqi -
很希望这个版的事实版主来 ...
成功了是自己努力,不成功是因为别人不公平。 仔细看看这个版里的口径,就感觉都是事 ...
-- by bcccs






评论排行榜