Windows Phone 8内存控制研究:LonglistSelector使用陷阱

最近工作中常常被问到如何降低WP内存使用,便再一次开始研究内存问题,首先发现了LonglistSelector使用的一个常见问题:

概述

若将Longlistselector 控件的ItemsSource设置为ViewModel中的一个ObservableCollection集合,那么应该值得注意内存问题。

问题的产生

下面的demo中,模拟了如下场景ItemSource Binding到了Page以外的静态ObservableCollection上。那么如果我们的程序结构如果是

MainPage->LoginPage 的话,来回在MainPage和LoginPage间切换就会导致内存中有多个LoginPage不能被释

namespace Feinno.Beside.View.Pages
{
    public class BindingSource
    {
        public static ObservableCollection<object> Collection =
            new ObservableCollection<object>();
    }
    public partial class LoginPage : PhoneApplicationPage
    {
        public LoginPage()
        {
            InitializeComponent ();
       //List 为xaml中定义的Longlistselector
            list .ItemsSource = BindingSource.Collection;             

            Debug .WriteLine("Initialze page!! hashcode = " + GetHashCode());
        }
         ~LoginPage()
        {
            Debug .WriteLine("Uninitialze page!! hashcode = " + GetHashCode());
        }
    }
}

正常状态(无内存问题)的打印如下:             而上面代码的打印如下:

page可以及时销毁。

 

可以看出,在来回切换页面的时候,之前的页面并没有得到释放,而是一只在内存中。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/

产生原因

笔者尝试使用Listbox来执行同样的代码,并不会出现上述问题,所以分析感觉是Windows Phone 8 新增的Longlistselector有问题,

具体原因是因为ObservableCollection 对外会暴露CollectionChanged接口将LonglistSelector的ItemSource赋值为ObservableCollection的时候,LonglistSelector通过此接口来监听列表中集合的改变,由于使用的是强事件,那么ObservableCollection中将会持有对LonglistSelector的引用,如此便导致离开页面之后,GC回收资源的时候,认为LoginPage仍在使用中,从而导致我们不希望看到的结果。

解决办法  

当存在上述类似场景的Itemsource设定时,在页面离开时将Itemsource设为null

深入分析

如此说来若Page中的控件Binding到代码中的Binding Source会如何呢?

通过写Demo分析以及查阅相关资料,笔者得出一下结论:

1、LonglistSelector.ItemSource(ListBox无此问题)如果Binding到ObservableCollection,结果和上文中一致,Page无法释放。

2、其他属性的Binding 不会导致上述问题。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 问题
, 页面
, binding
, public
bindingsource
windowsphone、windows phone 10、windows phone官网、windows、windows 应用商店,以便于您获取更多的相关知识。

时间: 2024-08-26 06:47:34

Windows Phone 8内存控制研究:LonglistSelector使用陷阱的相关文章

剖析Windows用1G内存还慢的原因_WindowsXP

现在的内存基本达到了1元/MB的均价,不少朋友的电脑告别了可怜的64MB.128MB内存,256MB已经成为标准配制,512MB甚至1GB的内存也不再是"耸人听闻".但是有一件事情让很多朋友疑惑:"为什么使用1G内存我的Windows启动.软件运行速度还是这么慢?" 安装大容量内存后,系统.程序运行效率没有得到大幅度提高,这是因为系统本身运行机制限制了其管理和运用硬件资源的能力.所以纵然硬件资源非常丰厚,如果超出了Windows管理的范围,那么性能也不会得到明显提升

如何关闭windows的UAC用户控制?

  如何关闭windows的UAC用户控制?          点击开始菜单---选择控制面板 切换到大图标模式 点击系统 选择操作中心 点击边上的更改用户账户控制 来到UAC界面 吧通知拉到底吧 点击确定之后会提醒你 完成之后记得要重启你的电脑之后才生效的哦

Windows优化大师Wopti内存管理教程

Windows系统的内存管理并不总是十分有效.许多用户在刚启动系统时,觉得Windows的运行速度蛮快速的,可是过了一阵以后(例如,玩了一会儿大型的3D电子游戏退出后)就觉得整个系统的运行速度明显下降了.这是怎么回事呢?原来,由于物理内存总有上限,所以Windows系统采用了虚拟内存分页映射的机制管理内存,也就是分页系统通过分配部分硬盘作为附加内存.当被称为页的小块内存不再使用时,可以将它们存放到磁盘上去,以便腾出更多的物理内存空间.当Windows9x启动时,操作系统就要占掉差不多20多M物理

数组和内存控制

数组和内存控制 一. 数组初始化: a) 静态初始化: 初始化时由程序员指定数组元素值:系统会自动决定该数组的长度. b) 动态初始化: 初始化时,程序员指定数组的长度,系统默认为数组元素赋初始化. //采用静态初始化方式初始化第一个数组 String[] books = new String[] { "仓央嘉措诗集", "人生若只如初见", "当时只道是寻常" }; //采用静态初始化的简化形式初始化第二个数组 String[] names =

【翻译】linux中cgroups内存控制子系统memory.oom_control文件

翻译自:redhat文档的部分内容. 新linux内核cgroup的memory子系统提供memory.oom_control来开关cgroup中oom killer,并且提供了消息接口. memory.oom_control 包含一个标志(0或1)来开启或者关闭cgroup的OOM killer.如果开启(1),任务如果尝试申请内存超过允许,就会被系统OOM killer终止.OOM killer在每个使用cgroup内存子系统中都是默认开启的.如果需要关闭,则可以向memory.oom_co

请问有谁知道windows系统共享内存映射方式通信时双方等待超时是什么原因

问题描述 请问有谁知道windows系统共享内存映射方式通信时双方等待超时是什么原因 //让服务器处理请求 if(!(::SetEvent(hExec))) { printf("发送请求失败!n"); bResult=false; return bResult; } //等待服务器处理完毕 long wait=::WaitForSingleObject(hDone, 5000); 解决方案 ::WaitForSingleObject(hDone, 5000); 等待5秒,(5000毫秒

《中国人工智能学会通讯》——11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用

11.34 基于近似动态规划的优化控制研究及 在电力系统中的应用 上世纪 50 年代以来,在空间技术发展和数字计算机实用化的推动下,动态系统的优化理论得到了迅速的发展,形成了一个重要的学科分支--最优控制[1-2] .它在空间技术.系统工程.多级工艺设备的优化等领域都有越来越广泛的应用.因而更深入研究最优控制问题,无论在理论上,还是在实践上都具有重大的意义.最优控制理论的三大基石是经典变分理论.极小值原理及动态规划.经典变分理论只能解决控制无约束问题,即容许控制属于开集的一类最优控制问题,而工程

《中国人工智能学会通讯》——3.25 康复机器人的人机交互控制研究综述

3.25 康复机器人的人机交互控制研究综述 中风是一种急性的脑血管疾病,能够造成永久性的大脑神经损伤,发病规律通常难以预测,致残率一直居高不下.中风幸存者往往出现偏瘫.截瘫等后遗症,严重影响患者及其家庭日常生活,带来极大的经济压力和精神痛苦.卫生部的统计数据显示,截止到 2012 年底,我国中风标化患病率约为1.82 %,40 岁以上的罹患人群高达 1 036 万人,其中 65 岁以下人群约占 50 %,呈年轻化趋势[1] .根据第二次全国残疾人抽样调查[2]和第六次全国人口普查的数据[3]推算

Windows任务管理器原理+内存管理机密+揭穿内存优化工具的骗局

我们在浏览网页时,也许会经常看到一些弹出广告,例如"整理内存碎片.提升系统性能".或者"大大减少系统和程序崩溃的可能性,回收垃圾内存"等等.如果点击这些弹出广告链接,则会看到某些所谓的优化软件,声称只需花费9.95.14.95或者29.95美元,就可以轻松实现所有的功能.看上去,这些工具软件确实不错,但是实际上最好的情况,这些所谓的内存优化工具没有任何效用:而最差的情况,则可能会严重降低系统性能. 盆盆评注 在国内,广告语更加精彩,"让您的系统运行如飞&q