救命啊!非常崩溃的问题!WPF如何清理内存?
这次做的系统有个严重的BUG...就是不知道怎么清理内存,要是这个程序一直开着并且有人一直在用,占用的内存就会越来越多...直到不可挽回!难道要我每个类都要重写Final...
这次做的系统有个严重的BUG...就是不知道怎么清理内存,要是这个程序一直开着并且有人一直在用,占用的内存就会越来越多...直到不可挽回!
难道要我每个类都要重写Finalize来析构,然后再继承IDisposable接口清理一下?总觉得不现实啊...毕竟这样的话每个控件的析构都要自己写死在程序里了,程序也太不灵活了吧?或者在WPF中一个Page能够用一个函数就把自己所有的Component都一次性析构掉?
请牛人拉我一把!感激不尽!
呵呵,首先感谢你细心的回答!
你终于明白俺的意思了,不过目前来说就是不知道如何解决这个问题啊
怎么说呢,目前来说我在用看起来像单例的东西在优化这个系统,但是问题依然还是有不少,因为我估计我目前这个系统会24小时都在运行,所以即使是很少的内存增加,在后期也会显得内存资源捉襟见肘,而且我也不可能给客户说你们要每隔多少小时重启一下系统.....
我现在就想在一定时间内,要是没人使用这个系统我就把生成的Object全部置空,但是我还是发现.NET有点在骗人,那就是我把那些Object置空之后,强制调用GC.Collection(),内存依然得不到释放,所以很无奈啊,.NET明明自己一直在说这样是可以强制GC回收资源的,不知你有何好的办法强制回收资源呢?
晕~其实也不算Singleton,硬要说的话,应该是叫Flyweight,可以减少对象的创建,这样就能节省资源了...
其实我现在的解决方案也是让这个进程Shut down,只是写了另一个入口程序,可以不让用户察觉,哈哈
内存泄露还能有检测软件?我最近还想自己写代码来监控一下呢,貌似不用了哈~我去找找看有没有合适的软件 -。-
非常感谢你的指点~要是有个像你这样牛人带带我我也不用这么痛苦了 T.T 展开
难道要我每个类都要重写Finalize来析构,然后再继承IDisposable接口清理一下?总觉得不现实啊...毕竟这样的话每个控件的析构都要自己写死在程序里了,程序也太不灵活了吧?或者在WPF中一个Page能够用一个函数就把自己所有的Component都一次性析构掉?
请牛人拉我一把!感激不尽!
呵呵,首先感谢你细心的回答!
你终于明白俺的意思了,不过目前来说就是不知道如何解决这个问题啊
怎么说呢,目前来说我在用看起来像单例的东西在优化这个系统,但是问题依然还是有不少,因为我估计我目前这个系统会24小时都在运行,所以即使是很少的内存增加,在后期也会显得内存资源捉襟见肘,而且我也不可能给客户说你们要每隔多少小时重启一下系统.....
我现在就想在一定时间内,要是没人使用这个系统我就把生成的Object全部置空,但是我还是发现.NET有点在骗人,那就是我把那些Object置空之后,强制调用GC.Collection(),内存依然得不到释放,所以很无奈啊,.NET明明自己一直在说这样是可以强制GC回收资源的,不知你有何好的办法强制回收资源呢?
晕~其实也不算Singleton,硬要说的话,应该是叫Flyweight,可以减少对象的创建,这样就能节省资源了...
其实我现在的解决方案也是让这个进程Shut down,只是写了另一个入口程序,可以不让用户察觉,哈哈
内存泄露还能有检测软件?我最近还想自己写代码来监控一下呢,貌似不用了哈~我去找找看有没有合适的软件 -。-
非常感谢你的指点~要是有个像你这样牛人带带我我也不用这么痛苦了 T.T 展开
1个回答
展开全部
你好,
“要是这个程序一直开着并且有人一直在用,占用的内存就会越来越多...直到不可挽回”
这句话我是相当的不理解……发生这样的事,与WPF没有关系吧?应该是程序本身编写的问题导致内存泄露。
GC会自动调出了作用域的类的析构,即使没有写Finalize,也会直接继承基类的析构函数的,怎么可能有内存一定释放不掉?
所以,问题只能是变量一直没出作用域,也就是设计上的问题。不知道你的系统是什么类型,如果可能,希望你能补充下问题。
==========================================
MSDN中关于NavigationService类的说明:
By default, NavigationService does not store an instance of a content object in navigation history. Instead, NavigationService creates a new instance of the content object each time it is navigated to by using navigation history. This behavior is designed to avoid excessive memory consumption when large numbers and large pieces of content are being navigated to. Consequently, the state of the content is not remembered from one navigation to the next.
默认状况下,NavigationService并不会在导航历史中保存任何导向的目标内容类的实例,作为替代,它每次都创建目标内容的新实例并保存在导航历史中。这个特性被设计用来防止当导航到大的(占内存大的)的成员或内容页时过度的内存消耗。当然,内容页的状态在导航中不会被保存。
=======分割一下,下面是我说的=====
其实NavigationService就是一个经过改进的特殊的Command模式实现,所做的改进正是为了防止内存消耗。而正因为它是Command模式的实现,它在导航过程中一定会保存与导航次数相等的类,只不过它并没有保存这些类的状态而已。
举个例子,按这个方式导航:Page1->Page2->Page3->Page2->Page4
此时,WPF内部将保存有5个类的实例
所以……导航次数与WPF中保存的Page类(或你的其他页面类)的关系是线性增长的:
Count(PageClass In Memory) = Navigation Times
而且,最过分的是,我没有看到关于BackStack和FowardStack大小的说明。
============再分割一下==============
我以前还真没认真看过方面,写了个代码测试了下,导航过程中增加的内存很小很小。
所以,我觉得你应该可以试着优化一下页面结构,尽量少放静态的内容在里面。
BTW,大概在MS眼中,每个服务器都应该有1TB内存……
MSDN中关于导航的说明:
http://msdn.microsoft.com/zh-cn/library/ms750478(VS.85).aspx#NavigationHistory
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
囧rz
强制回收……我一般Shutdown Server的说……你试试告诉客户每10小时运行一下Shutdown -s -f -t 1 好了~~
:) 玩笑。
按我的理解(MS没说……),导航这玩意应该是跟用户绑定的,用户离开网站的话他的历史堆栈就应该释放了。
我比较在意的是你说的那个Singleton,你用Singleton干嘛啦:)不会是因为Singleton一直拿着历史堆栈的引用导致GC没法回收吧……
刚才突然想到机器里有个传说中的内存泄露检测软件,运行了一下,一股灰尘……
我这个太旧啦,我在网上看了看,貌似大家都用DotTrace和ANTS Profiler的说~我下了个DotTrace,没玩明白……
这两天被个Delphi的破项目弄郁闷了,你先琢磨下吧,学会了教我哈~
“要是这个程序一直开着并且有人一直在用,占用的内存就会越来越多...直到不可挽回”
这句话我是相当的不理解……发生这样的事,与WPF没有关系吧?应该是程序本身编写的问题导致内存泄露。
GC会自动调出了作用域的类的析构,即使没有写Finalize,也会直接继承基类的析构函数的,怎么可能有内存一定释放不掉?
所以,问题只能是变量一直没出作用域,也就是设计上的问题。不知道你的系统是什么类型,如果可能,希望你能补充下问题。
==========================================
MSDN中关于NavigationService类的说明:
By default, NavigationService does not store an instance of a content object in navigation history. Instead, NavigationService creates a new instance of the content object each time it is navigated to by using navigation history. This behavior is designed to avoid excessive memory consumption when large numbers and large pieces of content are being navigated to. Consequently, the state of the content is not remembered from one navigation to the next.
默认状况下,NavigationService并不会在导航历史中保存任何导向的目标内容类的实例,作为替代,它每次都创建目标内容的新实例并保存在导航历史中。这个特性被设计用来防止当导航到大的(占内存大的)的成员或内容页时过度的内存消耗。当然,内容页的状态在导航中不会被保存。
=======分割一下,下面是我说的=====
其实NavigationService就是一个经过改进的特殊的Command模式实现,所做的改进正是为了防止内存消耗。而正因为它是Command模式的实现,它在导航过程中一定会保存与导航次数相等的类,只不过它并没有保存这些类的状态而已。
举个例子,按这个方式导航:Page1->Page2->Page3->Page2->Page4
此时,WPF内部将保存有5个类的实例
所以……导航次数与WPF中保存的Page类(或你的其他页面类)的关系是线性增长的:
Count(PageClass In Memory) = Navigation Times
而且,最过分的是,我没有看到关于BackStack和FowardStack大小的说明。
============再分割一下==============
我以前还真没认真看过方面,写了个代码测试了下,导航过程中增加的内存很小很小。
所以,我觉得你应该可以试着优化一下页面结构,尽量少放静态的内容在里面。
BTW,大概在MS眼中,每个服务器都应该有1TB内存……
MSDN中关于导航的说明:
http://msdn.microsoft.com/zh-cn/library/ms750478(VS.85).aspx#NavigationHistory
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
囧rz
强制回收……我一般Shutdown Server的说……你试试告诉客户每10小时运行一下Shutdown -s -f -t 1 好了~~
:) 玩笑。
按我的理解(MS没说……),导航这玩意应该是跟用户绑定的,用户离开网站的话他的历史堆栈就应该释放了。
我比较在意的是你说的那个Singleton,你用Singleton干嘛啦:)不会是因为Singleton一直拿着历史堆栈的引用导致GC没法回收吧……
刚才突然想到机器里有个传说中的内存泄露检测软件,运行了一下,一股灰尘……
我这个太旧啦,我在网上看了看,貌似大家都用DotTrace和ANTS Profiler的说~我下了个DotTrace,没玩明白……
这两天被个Delphi的破项目弄郁闷了,你先琢磨下吧,学会了教我哈~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询