2007-10-24
不解的内存泄露
关键字: java 内存
这边有个程序给改了之后发生了内存泄露
但是自己找不出原因
大家看看是哪出错了
这是根据jprofile找出的内存使用不正常的代码
下面是一个静态方法 我怀疑这里面有些引用在作怪
测试的时候发现内存缓慢上升,曾经8小时后 内存时候用量突破500MB
一直不解是怎么回事,跟踪后发现了parseHyberlinks的调用栈有问题,但是反复研究代码又看不出那边有什么引用没去掉。郁闷中。。。
但是自己找不出原因
大家看看是哪出错了
这是根据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的调用栈有问题,但是反复研究代码又看不出那边有什么引用没去掉。郁闷中。。。
评论
jems
2008-07-30
楼主解决了吗?
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
huanghit
2008-02-13
个人觉得是StringBuffer存在内存泄露。还有你给我们看的代码不全,因为StringBuffer.toString()这段没有看到(但是jprofile里面可以看到这个)。
相关支持请看: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724129
这是java lib 的一个bug.
相关支持请看: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724129
这是java lib 的一个bug.
fuliang
2007-11-12
引用
String hl=new String();
hl=Links.get(count);
干嘛每次new一个空的String,然后把引用h1指向另一个String
呢,这样每次都生成了一个垃圾String对象空字符串,JAVA
的GC不会在当一个对象成为垃圾对象就回收这个对象,得等积累到内存达到一定程度才去回收。
Godlikeme
2007-10-25
建议查查这两句
vUrlsMD5Collection.put(MD5Generator.generateMD5(currentUrl), currentUrl);
uvUrlsCollection.get(weight).add(hl);
vUrlsMD5Collection.put(MD5Generator.generateMD5(currentUrl), currentUrl);
uvUrlsCollection.get(weight).add(hl);
movingboy
2007-10-25
有没有可能是ParseHyperLinks()方法返回的ArrayList<String>对象没有释放?
尽管在addUrl(String currentUrl, ArrayList<String> Links)方法中调用了Links=null;,但在调用addUrl方法的方法里有没有释放呢?
尽管在addUrl(String currentUrl, ArrayList<String> Links)方法中调用了Links=null;,但在调用addUrl方法的方法里有没有释放呢?
agapple
2007-10-24
你的程序感觉应该是 spider 吧
前段时间也弄过,也出现了内存持续增长 , 后来也是用Jprofile才发现
是我一直保持Url的一个队列,没有很好的对它进行优化,导致不到两小时
eclipse就挂了 。。。
前段时间也弄过,也出现了内存持续增长 , 后来也是用Jprofile才发现
是我一直保持Url的一个队列,没有很好的对它进行优化,导致不到两小时
eclipse就挂了 。。。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 2469 次
- 性别:

- 来自: 南京

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






评论排行榜