UWP开发入门(十六)——常见的内存泄漏的原因

UWP开发入门(十六)——常见的内存泄漏的原因
原文:UWP开发入门(十六)——常见的内存泄漏的原因

  本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍。

  内存泄漏的概念我这里就不说了,之前《UWP开发入门(十三)——Diagnostic Tool检查内存泄漏》中提到过,即使有垃圾回收机制,写C#还是有可能发生内存泄漏。

  一般来说,以下两种情况会导致内存泄漏:

  1. 对象用完了但是没有释放资源
  1. 对象本身是做了清理内存的操作,但是对象内部的子对象没有成功释放资源

  下面就UWP开发中具体的实例来说明需要避免的写法

  • static/global的对象上注册了事件
FakeService.Instance.ShowMeTheMoneyEvent += Instance_ShowMeTheMoneyEvent;

  比如我们有一个底层的FakeService,提供整个APP生命周期的数据和网络的访问。假设某个页面+=了这个FackServiceEvent,在离开页面时没有-=掉。那么该页面就无法被垃圾回收。

合理的做法是在OnNavigatedFrom方法里,把事件反注册掉。

        protected override void OnNavigatedFrom(NavigationEventArgs e){base.OnNavigatedFrom(e);FakeService.Instance.ShowMeTheMoneyEvent -= Instance_ShowMeTheMoneyEvent;}
  • DispatcherTimer事件未关闭

  这种情况就属于对象内部的属性未能被释放,假设页面内部存在Timer对象:

    public sealed partial class TimerPage : Page{private DispatcherTimer Timer { get; set; } = new DispatcherTimer();public ArrayList arrayList { get; set; }public TimerPage(){this.InitializeComponent();arrayList = new ArrayList(10000000);Timer.Tick += Timer_Tick;Timer.Interval = TimeSpan.FromSeconds(1);Timer.Start();}private void Timer_Tick(object sender, object e){int count = 0;int.TryParse(TextBoxTimer.Text, out count);count += 1;TextBoxTimer.Text = count.ToString();}private void Button_Click(object sender, RoutedEventArgs e){this.Frame.GoBack();}protected override void OnNavigatedFrom(NavigationEventArgs e){base.OnNavigatedFrom(e);Timer.Stop();}}

  如果在离开页面之前,未调用Timer对象的Stop方法,也未-=Tick事件(这里Stop方法会自动-=Tick事件)。该页面就不能正常的回收。

  这里并不是说所有的Event都需要在OnNavigatedFrom方法中-=,例如Control本身的LoadedIsEnabledChanged等事件等并不会造成内存泄漏,反注册这些事件是为了避免事件的重复触发。而DispatcherTimer比较特殊,我理解它会把自己加到一个专门维护计时器的队列中,然后不停的触发Tick事件,如果没有Stop-=,就等于Timer一直引用了外部的对象,从而导致页面本身也无法回收。

  • Data Binding Memory Leak

  这一条在很多的文档上有所提及,很遗憾我没法通过Diagnostic Tools监测出来具体的泄漏,我猜测可能是很小规模的内存泄漏。但是避免的方式非常容易,只要平时写XAML注意一下就可以了。

  会出现问题的写法是以下两种:

  1. 未实现INotifyPropertyChanged的对象,而你又想监测Property变化
  2. 未实现INotifyCollectionChanged 接口的集合,而你又想监测Collection变化

  其实很好处理。如果想监测变化,就老老实实继承对应的接口。如果使用了普通的Property和集合,并且不想监测变化,一定记得Mode = OneTime

  当然如果属性本身是dependency property,就不存在内存泄漏的情况了。

        <!--内存泄漏,因为Children集合没有实现INotifyPropertyChanged来通知Count属性变化--><TextBlock Text="{Binding ElementName=layoutRoot, Path=Children.Count}" /><!--不会内存泄漏,因为ActualWidth是依赖属性--><TextBlock Text="{Binding ElementName=layoutRoot, Path=ActualWidth}" /><!--不会内存泄漏,因为Mode = OneTime--><TextBlock Text="{Binding ElementName=layoutRoot, Path=Children.Count, Mode = OneTime}" />
  • 非托管资源的释放

  这个都非常熟悉,不多说了。主要是通过using语句,或者在try { … } finally { … }中调用Dispose或者Close方法来释放非托管资源。

 

posted on 2017-09-20 13:35 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/7561009.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文了解72名图灵奖获得者的成就

来源&#xff1a;图灵教育今天是计算机科学之父、人工智能之父 艾伦麦席森图灵 诞辰 108 周年。作为“图灵意志”的传承者&#xff0c;依照惯例&#xff0c;在今日纪念这位伟人。从“图灵机”到“图灵测试”&#xff0c;从破译德军的 Enigma 到自杀之谜&#xff0c;图灵一生都是…

安卓修改wifi已停用_手机连不上wifi显示已保存怎么回事【原因介绍】

问&#xff1a;为什么手机连不上wifi显示已保存?手机在连接WiFi的时候&#xff0c;WiFi显示已保存&#xff0c;手机连接不上wifi信号。请问这是什么原因引起的&#xff0c;应该怎么解决这个问题。答&#xff1a;如果手机连接wifi时&#xff0c;显示已保存&#xff0c;手机连接…

有关 Lambda linq练习 有待整理

1、 查询Student表中的所有记录的Sname、Ssex和Class列。(select sname,ssex,class from student) Students.Select(s> new { sname>s.sname,ssex>s.ssex, class>s.class})linq:from s in Students select new{s.sname, } 2.查询教师所有的单位即不重复的Depart列…

机器人智能抓取系统:目前几种主流的解决方案

文章来源&#xff1a;COBOT机器人大脑、新机器视觉机器人学习中的经典问题之一便是分拣&#xff1a;在一堆无序摆放的物品堆中&#xff0c;取出目标物品。在快递分拣员看来&#xff0c;这几乎是一个不需要思考的过程&#xff0c;但对于机械臂而言&#xff0c;这意味着复杂的矩阵…

mysql 5.6的gtid_mode_[MySQL 5.6] GTID实现、运维变化及存在的bug

本文的主要目的是记下跟gtid相关的backtrace&#xff0c;用于以后的问题排查。另外也会讨论目前在MySQL5.6.11版本中存在的bug。前言&#xff1a;什么是GTID什么是GTID呢&#xff0c; 简而言之&#xff0c;就是全局事务ID(global transaction identifier )&#xff0c;最初由go…

bzoj1018 [SHOI2008]堵塞的交通traffic

题目链接 分析&#xff1a; 这道题的题解很长&#xff0c;所以就不粘题面了&#xff0c;我们一点一点讲明白这道题 很荣幸&#xff0c;我看了题面之后 想到了这道题 可以很高兴的发现10w是线段树能够承受的范围 我们可以利用线段树维护连通性&#xff0c;每个节点内我们要维…

Science重磅!人类特有基因触发猴子长出更强大的大脑

本文系生物谷原创编译&#xff0c;欢迎分享&#xff0c;转载须授权&#xff01;人类大脑在进化过程中的扩张&#xff0c;特别是新大脑皮层的扩张&#xff0c;与诸如推理和语言等认知能力有关。有一种叫做ARHGAP11B的基因&#xff0c;只在人类身上表达&#xff0c;它能触发大脑干…

mysql不同的类的个数_Mysql数据库-SQL优化-统计某种类型的个数

有时我们想统计某种类型有多少个&#xff0c;会用这个SQL。全表扫描之余&#xff0c;还要filesort&#xff0c;耗时1.34秒。mysql> select country,count(*) from t1 group by country;-------------------| country | count(*) |-------------------| NULL | 32 || africa …

『实践』Matlab实现Flyod求最短距离及存储最优路径

Matlab实现Flyod求最短距离及存储最优路径 一、实际数据 已知图中所有节点的X、Y坐标。 图中的节点编号&#xff1a;矩阵中的编号 J01-J62:1-62; F01-F60:63-122; Z01-Z06:123-128; D01-D02:129-130. 二、Floyd求所有节点间的最小距离及通过矩阵存储最优路径的节点 1 function …

MIT Technology Review 2020年“十大突破性技术”解读 【中国科学基金】2020年第3期发布...

来源&#xff1a;国家自然科学基金委员会MIT Technology Review 2020年“十大突破性技术”解读&#xff3b;编者按&#xff3d; 2020年2月26日&#xff0c;MIT Technology Review一年一度的“十大突破性技术”榜单正式发布。自2001年起&#xff0c;该杂志每年都会评选出当年的…

动态代理Java实现

思考&#xff1a;在IBuyWatermelon添加一个方法selectWatermelon() 静态代理中需要在RealSubject中实现该方法&#xff0c;而且Proxy也要实现该方法调用RealSubject中的实现&#xff0c;如果再增加10个方法还是得这样操作&#xff0c;导致大量的代码重复。 现在来看动态代理&am…

mysql 非等值条件 索引_慢SQL简述与定位

慢SQL日志简述通过命令和查看日志文件的方式直接查看mysql服务器的慢sql参数配置参数作用slow_query_log是否启用slow_query_log_file日志文件long_query_time慢sql阈值log_slow_adimin_statements是否记录数据库管理相关的sqllong_queries_not_using_indexes是否记录未使用索引…

大数据是怎么知道你去过新发地的?

来源&#xff1a;科学加&#xff08;北京科技报记者&#xff1a;赵天宇&#xff09;“经过全市大数据分析&#xff0c;您可能在5月30日(含)以后去过新发地批发市场……”随着新发地市场新冠源头被锁定&#xff0c;近日来&#xff0c;大数据筛查&#xff0c;成为不少北京市民在朋…

[模板]洛谷T3379 最近公共祖先(LCA) 倍增+邻接表

一年前听说的这东西。。。现在终于会了。。。 1 #include<cstdio>2 #include<iostream>3 #include<cstring>4 #include<cmath>5 #include<ctime>6 #include<cstdlib>7 8 #include<string>9 #include<stack>10 #include<que…

mysql更新数据能回滚吗_MySQL数据回滚-误更新和删除时快速恢复

这世界上有后悔药– www.houhuiyao.cc 后悔药数据恢复 站长语前面的内容也提到过update或delete误更新删除了数据后如何恢复。实际生产环境中常常因各种不同场景导致一些办法有效一些办法无效&#xff0c;当然&#xff0c;最有效的办法依然是备份&#xff01;虽然啰嗦&#xff…

口罩巨头挑战“量子霸权”,3个月造出的『最强量子计算机』靠谱不?

摘要霍尼韦尔(Honeywell)最近可是非常忙活。作为全球数一数二的口罩厂商&#xff0c;疫情期间霍尼韦尔一直在努力生产口罩&#xff0c;大家对它的印象也多停留在口罩生产者的层面。但是事实上&#xff0c;人家是正经的多元化高科技制造企业&#xff0c;航空产品、汽车产品、涡轮…

三极管稳压管组成的线性电源关键理解

1. A点电压为20V.B点电压是稳压管电压5.6V.则A到B的电流是固定的。 2. 加电后在调整三极管&#xff0c;负载&#xff0c; 稳压管的电流回路如图。&#xff08;注意电流方向&#xff0c;a->b电流方向和大小都是基本不变的。&#xff09; 转载于:https://www.cnblogs.com/ture…

oci连接mysql_使用 OCILIB 连接并操作 Oracle 数据库

OCILIB是一个跨平台的Oracle驱动程序&#xff0c;可提供非常快速和可靠地访问Oracle数据库。它提供了一个丰富&#xff0c;功能齐全&#xff0c;并易于使用的APIOCILIB是一个跨平台的Oracle驱动程序&#xff0c;&#xff0c;可提供非常快速和可靠地访问Oracle数据库。它提供了一…

万字长文:2020智源大会总结-多角度看AI的未来

来源&#xff1a;混沌巡洋舰导读&#xff1a;智源大会2020 聚焦AI的未来&#xff0c;大家都知道&#xff0c; 2010是深度学习的时代&#xff0c; 我们经历了AI从巅峰进入到瓶颈的过程。那么什么是2020这个十年AI的中心&#xff1f;近一段大家逐步从各个不同的角度切入到这个主题…

python OCR 图形识别

1、pip install pyocr 2、pip install PIL 3、安装tesseract-ocr http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe exe文件&#xff0c;下载后直接安装&#xff0c;建议默认安装过程中的选项&#xff0c;安装目录默认C:\Program F…