最近发现写得一个服务程序,内存泄露,使得程序不能够7*18小时的运行(晚上0-6点)。
为了解决这个问题,想到了3个办法,请 各位老大帮忙说下可行性:
1:把所有的类都继承IDispose(),并实现资源释放,所有创建的对象都及时设置为null(这个不太能够实现,业务代码很多,使用的线程,事件等等很多,不太可能逐行的查看代码)
2:在写个服务程序,定时重启服务。(这个虽然能够重启服务,但是,占用的内存好像还是不能够一下子释放完)
3:修改原有服务程序,把原有服务程序 的业务代码等,全部放到一个AppDomain里面,定时检查这个AppDomain,并自动释放和创建。(不知道这个方法可以不 ,跪求这样的代码)
也跪求工具,用来查看内存被那些线程,对象等占用。。。
所有的类都实现IDisponse并不是个好办法,修改工作量太大了,要显式调用Disponse方法才能释放。
要是重启服务一下都不能释放完的话,是不是线程非后台线程?所以,程序关闭,而线程还在运行。
一般内存占用不释放有几个原因:
1、递归,在递归方法中使用大对象,会造成大对象来不及回收;
2、非托管组件,非托管组件需要自己释放;
3、静态字段;
4、线程驻留,一般是被阻塞了
彻底解决办法还是要查出内存泄漏的原因。
建议用 .NET Memory Profiler 这个工具来跟踪内存使用情况
http://www.cnblogs.com/eaglet/archive/2008/09/05/1285169.html
不要经常创建对象,尽可能的缓存一个对象的副本
CLR Profiler 可以给出详细的信息
1:把所有的类都继承IDispose(),并实现资源释放,所有创建的对象都及时设置为null(这个不太能够实现,业务代码很多,使用的线程,事件等等很多,不太可能逐行的查看代码)
如你所言,不太能够实现,只能督促自己,以后的项目一定要养成使用 using(something) 的好习惯,防止漏网之鱼。指导意义极大。
2:在写个服务程序,定时重启服务。(这个虽然能够重启服务,但是,占用的内存好像还是不能够一下子释放完)
以前和同事也谈过这个,就是定时 kill 某个“进程”,然后启动该程序。模仿人的“关闭”、“启动”行为。我不知道你说的“内容无法释放”是什么意思,"进程"都杀掉了,还能站着茅坑?
3:修改原有服务程序,把原有服务程序 的业务代码等,全部放到一个AppDomain里面,定时检查这个AppDomain,并自动释放和创建。(不知道这个方法可以不 ,跪求这样的代码)
能力不及,看着头晕。会不会是方案 2 的翻版?只不过增加了内存占用等检查措施,而不是一味的“猛杀猛起"。我见过通过 c# 启动 exe 等可执行文件的方法,包括杀死某个进程等。只要方向正确、坚定,手段我看不成问题,google 一下定能搞定!
第一感觉可能是事件导致的。