浏览 4167 次
锁定老帖子 主题:不解的内存泄露
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-24
但是自己找不出原因 大家看看是哪出错了 这是根据jprofile找出的内存使用不正常的代码 private ArrayList<String> ParseHyperLinks() throws ParserException { ArrayList<String> hyperLinks = new ArrayList<String>(); SimpleNodeIterator parseSimpleNodeIterator = null; if(getContentType().equalsIgnoreCase("text/html")) { try { Parser parse = new Parser(getHTMLEntity()); parseSimpleNodeIterator = parse.parse(new TagNameFilter("A")).elements(); } catch (ParserException e1) { Log4j.logger.debug(e1); e1.printStackTrace(); throw new ParserException(); } while(parseSimpleNodeIterator.hasMoreNodes()) { String extractLink=new String(); LinkTag link = (LinkTag) parseSimpleNodeIterator.nextNode(); if(link.isHTTPLink()) { extractLink = link.extractLink().trim(); // Log4j.logger.info(extractLink+"<<<<<<<<<<"); if(extractLink.startsWith("#")) continue; if(extractLink.startsWith("*")) continue; if(extractLink.equals("/")) continue; if(isFilterLink(extractLink)) continue; if(extractLink.contains(" ")) extractLink = extractLink.split(" ")[0]; if(extractLink.length() > 6) { if(!extractLink.substring(0, 4).equals("http")) { if(!extractLink.startsWith("/")) extractLink = "/" + extractLink; extractLink = url + extractLink; } } if(extractLink.length() <= 6) { if(!extractLink.startsWith("/")) extractLink = "/" + extractLink; extractLink = url + extractLink; } // Log4j.logger.info(">>>>>>>"+extractLink); hyperLinks.add(extractLink); extractLink=null; } } } return hyperLinks; } 下面是一个静态方法 我怀疑这里面有些引用在作怪 public static boolean addUrl(String currentUrl, ArrayList<String> Links) { Log4j.logger.info("robotsMap: "+RobotsTxtCache.robotsMap.size()); currentUrl=currentUrl.trim(); // first put the just url into the v. collection vUrlsMD5Collection.put(MD5Generator.generateMD5(currentUrl), currentUrl); ArrayList<String> robotstxt; // process the hyberlinks for(int count=0;count<Links.size();count++) { String hl=new String(); hl=Links.get(count); if(!vUrlsMD5Collection.containsKey(MD5Generator.generateMD5(hl))) { int weight = 10; Url u = null; try { u = new Url(hl); } catch (URISyntaxException e) { e.printStackTrace(); Log4j.logger.debug(e); return false; } System.out.println(">>>>>"+hl); weight = u.getPageWeigth(new BFSStrategy()); uvUrlsCollection.get(weight).add(hl); } } Links.clear(); Links.trimToSize(); Links=null; return true; } 测试的时候发现内存缓慢上升,曾经8小时后 内存时候用量突破500MB 一直不解是怎么回事,跟踪后发现了parseHyberlinks的调用栈有问题,但是反复研究代码又看不出那边有什么引用没去掉。郁闷中。。。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-10-24
你的程序感觉应该是 spider 吧
前段时间也弄过,也出现了内存持续增长 , 后来也是用Jprofile才发现 是我一直保持Url的一个队列,没有很好的对它进行优化,导致不到两小时 eclipse就挂了 。。。 |
|
返回顶楼 | |
发表时间:2007-10-25
有没有可能是ParseHyperLinks()方法返回的ArrayList<String>对象没有释放?
尽管在addUrl(String currentUrl, ArrayList<String> Links)方法中调用了Links=null;,但在调用addUrl方法的方法里有没有释放呢? |
|
返回顶楼 | |
发表时间:2007-10-25
建议查查这两句
vUrlsMD5Collection.put(MD5Generator.generateMD5(currentUrl), currentUrl); uvUrlsCollection.get(weight).add(hl); |
|
返回顶楼 | |
发表时间:2007-11-12
引用 String hl=new String(); hl=Links.get(count); 干嘛每次new一个空的String,然后把引用h1指向另一个String 呢,这样每次都生成了一个垃圾String对象空字符串,JAVA 的GC不会在当一个对象成为垃圾对象就回收这个对象,得等积累到内存达到一定程度才去回收。 |
|
返回顶楼 | |
发表时间:2008-02-13
个人觉得是StringBuffer存在内存泄露。还有你给我们看的代码不全,因为StringBuffer.toString()这段没有看到(但是jprofile里面可以看到这个)。
相关支持请看: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724129 这是java lib 的一个bug. |
|
返回顶楼 | |
发表时间:2008-06-09
我在做一个Spider的时候,也是发现内存泄露问题。
困扰了我两个星期,后来发现是Java的String的subString引起的。从一个非常大的String(比如网页的全部内容)取得一个哪怕一个字节的小String,整个原始String都不会被释放。久而久之,内存占用就到了一个非常大的程度。 我写了一篇文章总结这个问题。 http://www.baizeju.com/html/Java/200806/06-66.html |
|
返回顶楼 | |
发表时间:2008-07-30
楼主解决了吗?
|
|
返回顶楼 | |