浏览 775 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-10-24 关键字: java 内存
这边有个程序给改了之后发生了内存泄露
但是自己找不出原因 大家看看是哪出错了 这是根据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的调用栈有问题,但是反复研究代码又看不出那边有什么引用没去掉。郁闷中。。。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间: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 |
|
| 返回顶楼 | |









