Silverlight内存泄露(一)序
不知道有多少人遇到过Silverlight程序内存狂涨的状况,点击几个按钮、跳转几个页面程序的内存使用量一直上升。
即使最简单的程序,用silverlight模板,创建一个导航程序,跳转几次页面silverlight内存使用也再增加。
托管代码内存由GC回收,在silverlight、wpf出现之前内存泄露出现的比较少,但是silverlight程序却很容易发生内存泄露。
最近一直再处理Silverlight内存泄露问题,但网上相关内容很少,一些经验和大家分享。
托管代码内存泄露原因
GC介绍:NET中GC小记
http://www.cnblogs.com/aaronbao/archive/2010/04/04/1692925.html
GC并不能保证不发生内存泄露,GC只会会根据自身算法回收GC认为不再使用的对象,由于程序bug,有些对象在GC看来仍然被使用,但是这些对象都不再使用了应该被回收。
托管代码可能发生内存泄露的情况:
- Static references
- Event with missing unsubscription
- Static event with missing unsubscription
- Dispose method not invoked
- Incomplete Dispose method
文章中使用Dispose注销事件,个人认为这种使用方式是错误的,至少不被推荐使用,下面会讨论这个问题。
详细内容参考下面文章:.net程序如何避免内存泄露
http://msdn.microsoft.com/en-us/library/ee658248.aspx
WPF可能发生内存泄露的情况
Leak Description | Developer Error | NETFX 3.0 | NETFX 3.5 | NETFX 3/5 sp1 |
Improper Use of Event Handlers | X | |||
Improper Use of Data Binding | X | |||
Improper Use of Command Binding | X | X | X | X |
Improper Use of Static Event Handlers | X | |||
Use BitmapImage in ImageSource | X | X | ||
Multiple Use of BitmapImage | X | |||
Use of downloaded BitmapImage | X | |||
CMilChannel leaks if initial HWND destroyed on XP | X (XP only) | X (XP only) | X (XP only) | |
ShutdownListener leaked for each thread using Binding | X | X | X | |
Create and Destroy WriteableBitmap on XP in HW | X (XP in HW Only) | |||
SW Viewport 3D w/ VisualBrush, WB, etc. leaks on XP | X (XP in HW Only) |
Silverlight内存泄露原因:
1. 由silverlight本身的bug导致
期待Silverlight新版本的能解决问题。但是如果真对性能要求很高,可以找出引起内存泄露的代码或者xaml,换一种实现方式。这部分不多讨论,下面链接讨论了silverlight引起内存泄露的情况http://forums.silverlight.net/forums/t/171739.aspx
2. 程序bug,除了上述引起内存泄露的情况外,Silverlight引起内存泄露的情况还有:
a) Command引起的内存泄露
b) Style、Xaml引起的内存泄露
c) 弱引用引起的内存泄露——按道理弱引用不会产生内存泄露,但实际情况并非如此,弱引用看似简单,但其实却很难用好。哪怕及时释放掉了实际的对象,但弱引用数组还是会继续持有引用,这就导致了内存泄漏。可能和silverlight的bug有关。参看wpf 弱引用补丁http://www.infoq.com/cn/news/2010/06/WPF-Memory-Leaks
d) MEF等第三方注入库可能引起内存泄露
文章列表
当前想到可能包含下面的文章,有时间就会写:
1. 如何检测SIlverlight内存泄露
2. 如何解决内存泄露问题
3. 事件使用错误引起内存泄露
4. 静态引用引起内存泄露
5. Command引起的内存泄露
6. Style、Xaml引起的内存泄露
7. 弱引用引起的内存泄露
8. MEF等第三方注入库可能引起内存泄露
9. Dispose为何不应该被用来解决托管内存泄露问题——mvvmlight
参考:http://stackoverflow.com/questions/620733/memory-leak-in-c