首页新闻找找看学习计划

c#程序如何避免内存泄漏?

0
悬赏园豆:10 [已解决问题] 解决于 2013-12-07 10:45

本人使用.net也有五六年了,最近写了个需要长时间从网络进行数据采集的程序,因为采集程序是类似爬虫的功能,是从指定一些网站按一定的规则来爬。

因为爬虫纵向深度较大,网站数据量也很大,经常一个网站至少要运行几天,所以一个程序要运行几天到几十天不等,程序现在已经写出来了,但问题也来了:

内存泄漏。以前没有写过运行时间这么长的数据密集型操作。起初也遇到了性能问题,通过“注释-》观察-》再注释-》再观察...”解决了,但运行时间都不长,问题在短时间内也很明显。但现在内存泄漏很不明显,一个小时增5M,有时看不出来,但时间稍长一定会出现,运行个三五天或再多几天,内存耗尽,程序就挂了。

 

所以想知道,写代码时从哪些方面可以注意以避免此类问题,总不能写个类似程序,然后每次都要例行的来使用.net memory profile来进行调试吧?

问题补充:

曾经试过定期重启程序,但程序的中间数据有时难以序列化,很多操作续接也相当复杂。特别是程序如果一有变动影响到这块,就更复杂了。有没有更好的办法呢?

空明流光的主页 空明流光 | 初学一级 | 园豆:48
提问于:2013-12-04 21:31
< >
分享
最佳答案
0

不释放已经处理过的东西的吗? 

收获园豆:10
问天何必 | 老鸟四级 |园豆:3301 | 2013-12-04 21:59

当然会释放了,基本上每一行代码我至少扫描了十遍以上,这个程序已经持续半年了。

空明流光 | 园豆:48 (初学一级) | 2013-12-04 22:01

@沧海一杰: 我之前写过一个采集程序, 也有这个问题。 我用了SetProcessWorkingSetSize

[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);



private void C()
{
if (_flag >= _pointList.Count)
{
GC.Collect(2);
GC.WaitForPendingFinalizers();
GC.Collect();
webBrowser1.Dispose();
webBrowser1 = new ExtendedWebBrowser();
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
return;
}
_gp = _pointList[_flag];
Thread.Sleep(_gp.Interval);

...........

 

已经用了一年了, 没什么问题。 不过。。。 因为没看到你的代码。。。 我只能说用SetProcessWorkingSetSize可以设置操作系统划分给进程使用的内存容量。。。 不排除影响其它的。。。。

最好还是优化代码、释放、回收。 而且这东西我觉得也要负载均衡, 一台控制服务器做调度, 给其它服务器分配采集任务。。。只有一台去做采集………………囧

问天何必 | 园豆:3301 (老鸟四级) | 2013-12-04 22:28

@问天何必: 就你一个人回答了,其实你的方法我以前已经知道了,但对我的问题似乎没多大效果。谢谢。

空明流光 | 园豆:48 (初学一级) | 2013-12-07 10:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册