浏览 2212 次
锁定老帖子 主题:不解的内存泄露(2)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-31
所以前面的帖子就没看 当然问题也没解决 http://www.iteye.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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-06-09
我在做一个Spider的时候,也是发现内存泄露问题。
困扰了我两个星期,后来发现是Java的String的subString引起的。从一个非常大的String(比如网页的全部内容)取得一个哪怕一个字节的小String,整个原始String都不会被释放。久而久之,内存占用就到了一个非常大的程度。 我写了一篇文章总结这个问题。 http://www.baizeju.com/html/Java/200806/06-66.html |
|
返回顶楼 | |