`
waldenlake
  • 浏览: 17172 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

不解的内存泄露

阅读更多
这边有个程序给改了之后发生了内存泄露
但是自己找不出原因
大家看看是哪出错了

这是根据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的调用栈有问题,但是反复研究代码又看不出那边有什么引用没去掉。郁闷中。。。
  • 描述: 跟踪到的类内存使用
  • 大小: 125.4 KB
  • 描述: 对象个数飙长
  • 大小: 121.7 KB
  • 描述: 就是这个char[]
  • 大小: 109.1 KB
分享到:
评论
8 楼 tang1943 2014-04-23  
[u][u][u][u]
引用
引用
引用
引用
引用
引用
引用
引用
引用
引用
  • [img][img][img][url][url][url][*]
    [*]
    [*]
    [*]
    [*][*]
    [t[b][b][b][b][b][b][b][b][b][b]able]
    [*]
    [*]
    [/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
    [*][*]
    [/flash][/flash][/flash][/flash][/flash][/flash][/flash]
    ||||||||
  • |||||||
  • |||||||
  • ||||||
  • ||||||
  • |||||
  • |||||
  • ||||
  • ||||
  • |||
  • |||
  • ||
  • ||
  • |
  • |
  • [/url][/url][/url][/img][/img][/img]
[/u][/u][/u][/u]
7 楼 jems 2008-07-30  
楼主解决了吗?
6 楼 Autinhorse 2008-06-09  
我在做一个Spider的时候,也是发现内存泄露问题。
困扰了我两个星期,后来发现是Java的String的subString引起的。从一个非常大的String(比如网页的全部内容)取得一个哪怕一个字节的小String,整个原始String都不会被释放。久而久之,内存占用就到了一个非常大的程度。
我写了一篇文章总结这个问题。
http://www.baizeju.com/html/Java/200806/06-66.html
5 楼 huanghit 2008-02-13  
个人觉得是StringBuffer存在内存泄露。还有你给我们看的代码不全,因为StringBuffer.toString()这段没有看到(但是jprofile里面可以看到这个)。
相关支持请看: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4724129
这是java lib 的一个bug.
4 楼 fuliang 2007-11-12  
引用

String hl=new String();
hl=Links.get(count); 

干嘛每次new一个空的String,然后把引用h1指向另一个String
呢,这样每次都生成了一个垃圾String对象空字符串,JAVA
的GC不会在当一个对象成为垃圾对象就回收这个对象,得等积累到内存达到一定程度才去回收。
3 楼 Godlikeme 2007-10-25  
建议查查这两句
vUrlsMD5Collection.put(MD5Generator.generateMD5(currentUrl), currentUrl);  
uvUrlsCollection.get(weight).add(hl);  
2 楼 movingboy 2007-10-25  
有没有可能是ParseHyperLinks()方法返回的ArrayList<String>对象没有释放?
尽管在addUrl(String currentUrl, ArrayList<String> Links)方法中调用了Links=null;,但在调用addUrl方法的方法里有没有释放呢?
1 楼 agapple 2007-10-24  
你的程序感觉应该是 spider 吧

前段时间也弄过,也出现了内存持续增长 , 后来也是用Jprofile才发现

是我一直保持Url的一个队列,没有很好的对它进行优化,导致不到两小时

eclipse就挂了 。。。

相关推荐

Global site tag (gtag.js) - Google Analytics