论坛首页 入门技术论坛

不解的内存泄露(2)

浏览 2212 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-31  
因为前面一个星期回家看病(都是coding)惹得祸 所以一直没上线

所以前面的帖子就没看
当然问题也没解决     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
   发表时间:2008-06-09  
我在做一个Spider的时候,也是发现内存泄露问题。
困扰了我两个星期,后来发现是Java的String的subString引起的。从一个非常大的String(比如网页的全部内容)取得一个哪怕一个字节的小String,整个原始String都不会被释放。久而久之,内存占用就到了一个非常大的程度。
我写了一篇文章总结这个问题。
http://www.baizeju.com/html/Java/200806/06-66.html
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics