首页 新闻 会员 周边

寻找 内存泄漏的解决办法

0
悬赏园豆:50 [已关闭问题]

最近发现写得一个服务程序,内存泄露,使得程序不能够7*18小时的运行(晚上0-6点)。

 

为了解决这个问题,想到了3个办法,请 各位老大帮忙说下可行性:

1:把所有的类都继承IDispose(),并实现资源释放,所有创建的对象都及时设置为null(这个不太能够实现,业务代码很多,使用的线程,事件等等很多,不太可能逐行的查看代码)

2:在写个服务程序,定时重启服务。(这个虽然能够重启服务,但是,占用的内存好像还是不能够一下子释放完)

3:修改原有服务程序,把原有服务程序 的业务代码等,全部放到一个AppDomain里面,定时检查这个AppDomain,并自动释放和创建。(不知道这个方法可以不 ,跪求这样的代码)

 

 

也跪求工具,用来查看内存被那些线程,对象等占用。。。

问题补充: 程序没有递归,同时,也没有调用非托管组件,也没有静态字段。。。 就是线程比较多。。。但是,线程也没有被阻塞的情况。。。。 程序里面,事件用的比较多。。。 主要是 有的地方,事件的 -= 不太能够实现。。。 看来,个人感觉,可以用 AppDomain来加载业务代码,然后,可以在一定的时间后,卸载 AppDomain,然后再创建一个,但是,不知道 主要做是不是可以,同时,没有这样的代码,呵呵,所以,希望大家能够帮忙提供一下。。。。 当然,我也知道最好的办法是把梳理一下程序流程,并释放对象等,但是,由于时间紧,不太好一下完成这工作量 现在程序每天内存占用增加30M左右。。。。。。
颜昌钢的主页 颜昌钢 | 初学一级 | 园豆:150
提问于:2008-09-04 23:34
< >
分享
其他回答(5)
0

所有的类都实现IDisponse并不是个好办法,修改工作量太大了,要显式调用Disponse方法才能释放。

要是重启服务一下都不能释放完的话,是不是线程非后台线程?所以,程序关闭,而线程还在运行。

一般内存占用不释放有几个原因:

1、递归,在递归方法中使用大对象,会造成大对象来不及回收;

2、非托管组件,非托管组件需要自己释放;

3、静态字段;

4、线程驻留,一般是被阻塞了

Birdshover | 园豆:352 (菜鸟二级) | 2008-09-05 03:04
0

彻底解决办法还是要查出内存泄漏的原因。

建议用 .NET Memory Profiler 这个工具来跟踪内存使用情况

 

http://www.cnblogs.com/eaglet/archive/2008/09/05/1285169.html

eaglet | 园豆:17139 (专家六级) | 2008-09-05 08:18
0

不要经常创建对象,尽可能的缓存一个对象的副本

lexus | 园豆:0 (初学一级) | 2008-09-05 08:57
0

CLR Profiler 可以给出详细的信息

winzheng | 园豆:8797 (大侠五级) | 2008-09-05 10:06
0

1:把所有的类都继承IDispose(),并实现资源释放,所有创建的对象都及时设置为null(这个不太能够实现,业务代码很多,使用的线程,事件等等很多,不太可能逐行的查看代码)

    如你所言,不太能够实现,只能督促自己,以后的项目一定要养成使用 using(something) 的好习惯,防止漏网之鱼。指导意义极大。

2:在写个服务程序,定时重启服务。(这个虽然能够重启服务,但是,占用的内存好像还是不能够一下子释放完)

    以前和同事也谈过这个,就是定时 kill 某个“进程”,然后启动该程序。模仿人的“关闭”、“启动”行为。我不知道你说的“内容无法释放”是什么意思,"进程"都杀掉了,还能站着茅坑?

3:修改原有服务程序,把原有服务程序 的业务代码等,全部放到一个AppDomain里面,定时检查这个AppDomain,并自动释放和创建。(不知道这个方法可以不 ,跪求这样的代码)

    能力不及,看着头晕。会不会是方案 2 的翻版?只不过增加了内存占用等检查措施,而不是一味的“猛杀猛起"。我见过通过 c# 启动 exe 等可执行文件的方法,包括杀死某个进程等。只要方向正确、坚定,手段我看不成问题,google 一下定能搞定!

陛下 | 园豆:3938 (老鸟四级) | 2008-09-05 13:45
0

第一感觉可能是事件导致的。  

玉开 | 园豆:8822 (大侠五级) | 2008-09-05 13:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册