内存泄漏在 WPF 和 Silverlight 提防
瑞奇韭菜礼物 ︰
内存泄漏在 WPF 和 Silverlight 提防

内存泄漏在 WPF 和 Silverlight 提防
WPF 和 Silverlight 允许您定义您的用户界面,用最少的代码将其绑定到数据源,意思说,你可能会没有意识的造成内存泄漏。因为 Silverlight 和 WPF 应用程序并为全状态,使我们能够保持状态的复杂的数据结构,以及丰富的 UI 元素的形式,这可以将添加到大小的内存泄漏,当事情出差错。
陷阱 1
未注册的事件
经典的泄漏常见到所有的.NET 应用程序和开发商共同监督。如果您创建一个事件处理程序来处理事件发生一些其他对象中,然后,如果你不清除链接,当你已经完成,不需要强将留下参考。
说我订阅OnPlaced事件我订单类,说这段代码执行按钮点击 ︰
Order newOrder=new Order
(“EURUSD”, DealType.Buy, Price ,PriceTolerance, TakeProfit, StopLoss); newOrder.OnPlaced+=OrderPlaced;
m_PendingDeals.Add(newOrder);
当价格是正确的时订单完成,并调用该OnPlaced事件,由OrderPlaced方法 ︰
void OrderPlace(Order placedOrder)
{
m_PendingDeals.Remove(placedOrder);
}
在我们订阅OnPlaced事件,并引用将使 Order 对象活着尽管我们已经从集合中删除它时, OrderPlaced事件处理程序仍然适用对从订单对象的引用。它是很容易犯这个错误。
陷阱 2
数据绑定
你没看错;数据绑定,您所依赖的东西可以导致内存泄漏。严格地说它是实际上的方式使用它导致泄漏。如果你有一个数据绑定到其父属性的子对象,可以会发生内存泄漏。下面显示了一个这样的例子。
<Grid Name="mainGrid">
<TextBlock Name=”txtMainText”
Text="{Binding ElementName=mainGrid, Path=Children.Count}" />
</Grid>
正如Children.Count如果绑定的属性是一个PropertyDescriptor属性,将只会发生的情况。这是因为,为了检测PropertyDescriptor属性发生更改时,框架必须订阅ValueChanged事件,反过来设置一个强引用链。
陷阱 3
静态事件
上一个静态对象的事件订阅将设置对处理该事件的任何对象的强引用。静力学,一个引用,应用程序域执行期间保持和因此这么做他们的所有引用。防止垃圾回收的强引用,只是内存泄漏的另一个名字。
陷阱 4
命令绑定
命令绑定允许您单独常见应用程序命令 (和它们的调用) 从处理它们的。您可以编写您的类来处理特定的命令,或不,和甚至表示是否可以执行这些命令。当这些绑定离开有害的强引用,身边躺着的时候出现问题,多和其他人一样,我们已经看到。
说我设置了一些子窗口中的代码来处理削减在父窗口内执行时。我第一次创建CommandBinding,,然后简单地将其添加到父窗口CommandBindings集合 ︰
好消息是.NET 框架现在照顾你,释放对象,也是超持谨慎态度。它锻炼是否认为一个特定的对象是要需要你的程序运行,而它只会释放该对象,如果它能完全保证,该对象不会再需要。
CommandBinding cutCmdBinding = new CommandBinding
(ApplicationCommands.Cut, OnMyCutHandler, OnCanICut); mainWindow.main.CommandBindings.Add(cutCmdBinding); ...
void OnMyCutHandler (object target, ExecutedRoutedEventArgs e)
{ MessageBox.Show("You attempted to CUT");
} void OnCanICut (object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
此代码泄漏因为我们就要出发的强引用指向孩子的mainWindow.main.CommandBindings对象中。结果,甚至当孩子关闭时,它将仍然在内存中。
陷阱 5
Dispatchertimer 泄漏
DispatcherTimer使用不当会导致内存泄漏。下面的代码创建新的DispatcherTimer在用户控件中,并为了便于看到石油泄漏,同时我还叫我的心头,使泄漏更加明显的字节数组。
public byte[] myMemory = new byte[50 * 1024 * 1024]; System.Windows.Threading.DispatcherTimer _timer = new System.Windows
.Threading.DispatcherTimer();
int count = 0; private void MyLabel_Loaded(object sender, RoutedEventArgs e)
{ _timer.Interval = TimeSpan.FromMilliseconds(1000); _timer.Tick += new EventHandler(delegate(object s, EventArgs ev) {
count++;
textBox1.Text = count.ToString();
}); _timer.Start();
}
在我的主窗口上我就StackPanel (后首先删除儿童) 按钮点击将泄漏内存的每次点击添加用户控件的实例。它向后使用蚂蚁内存探查器跟踪表明UserControl作为泄漏源。
问题是,再一次举行,这次由调度员,持有的活DispatcherTimers集合的引用。从集合的强引用保持每个用户控件还活着,并因此泄漏内存。
内存泄漏在 WPF 和 Silverlight 提防的更多相关文章
- wpf内存泄漏问题
http://www.cnblogs.com/Cindys/archive/2012/05/17/2505893.html http://blogs.msdn.com/b/jgoldb/archive ...
- WPF 内存泄漏优化经历
最近公司有个CS客户端程序,有个登录界面,有个程序的主界面,程序支持注销功能,但是在注销后,客户端的内存一直以40M-50M的速度递增,因此猜测,应该是WPF程序出现了内存泄漏.下面主要记录优化内存泄 ...
- 深入理解.NET/WPF内存泄漏
众所周知,内存管理和如何避免内存泄漏(memory leak)一直是软件开发的难题.不要说C.C++等非托管(unmanaged)语言,即使是Java..NET等托管(managed)语言,尽管有着完 ...
- 企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(2)
本书包含的章节内容 第一章:表现模式,以一个例子呈献给读者表现模式的发展历程,我们会用包括MVC和MVP在内的各种方式实现一个收费项目的例子.沿此方向,我们会发现每一种模式的问题所在,这也是触发设计模 ...
- Webservice WCF WebApi 前端数据可视化 前端数据可视化 C# asp.net PhoneGap html5 C# Where 网站分布式开发简介 EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下? SQL Server之深入理解STUFF 你必须知道的EntityFramework 6.x和EntityFramework Cor
Webservice WCF WebApi 注明:改编加组合 在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下, ...
- c#内存泄漏分析
背景 给客户开发了一个WPF应用,每隔一段时间就会很卡,推测是内存泄漏引起.需要监测内存使用情况. 使用的工具 Ants Memory Profiler 百度网盘下载地址 使用教程 入门使用 参考文档 ...
- 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye
一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...
- Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
前言: 其实RxJava引起的内存泄漏是我无意中发现了,本来是想了解Retrofit与RxJava相结合中是如何通过适配器模式解决的,结果却发现了RxJava是会引起内存泄漏的,所有想着查找一下资料学 ...
- Android性能优化之利用LeakCanary检测内存泄漏及解决办法
前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...
随机推荐
- 我所理解的OOP——UML六种关系(转)
转自:http://www.cnblogs.com/dolphinX/p/3296681.html 最近由于经常给公司的小伙伴儿们讲一些OOP的基本东西,每次草纸都被我弄的很尴尬,画来画去自己都乱了, ...
- 增加几个entity framework 的函数 (记录备忘)[转]
public static class DatabaseExtensions { public static DataTable SqlQueryForDataTatable(this Databas ...
- Unity3D学习笔记——选择Enemy
一.步骤: 1.创建三个Cube,并将这三个Cube的Cube的Tag设为Enemy 2.导入第一人称视角的资源 3.创建名为Targeting的C#脚本 4.编写Targeting脚本,并将它附到第 ...
- unity3d Human skin real time rendering plus 真实模拟人皮实时渲染 plus篇
最近逃课做游戏,逃的有几门都要停考了,呵呵呵,百忙之中不忘超炒冷饭,感觉之前的人皮效果还是不够好,又改进了一些东西 首先上图 放大看细节 显而易见的比上次的效果要好很多,此次我把模型用3dmax进行了 ...
- Bootstrap 3 兼容 IE8 浏览器
公司新上的项目,前端用的Bootstrap3的框架,但它已经放弃对IE9下的支持了.可IE8还是有着许多用户,不能不照顾到他们,IE7以下的,我只想说,现在什么年代了,要解放思想,与时俱进啊,就不能动 ...
- java对Ldap操作3
")); }}
- centos7免密码登录
2台主机 192.168.30.207 Master 192.168.30.251 Node1 三台主机检查 ~/.ssh 文件夹没有则新建 ssh-keygen -t rsa 一路狂按回车,最终生成 ...
- mongodb基本概念解析
MongoDB 概念解析 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档.集合.数据库,下面我们挨个介绍. 下表将帮助您更容易理解Mongo中的一些概念: SQL术 ...
- linux —— shell 编程(文本处理)
导读 本文为博文linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed aw ...
- /var/log目录下的20个Linux日志文件功能详解 分类: 服务器搭建 linux内核 Raspberry Pi 2015-03-27 19:15 80人阅读 评论(0) 收藏
如果愿意在Linux环境方面花费些时间,首先就应该知道日志文件的所在位置以及它们包含的内容.在系统运行正常的情况下学习了解这些不同的日志文件有助于你在遇到紧急情况时从容找出问题并加以解决. 以下介绍的 ...