一. 在wp7中,程序所使用内存不能超过90M, 否则会自动退出

二. 如果一个page没有被释放,那么它所包含的所有控件资源都不会被垃圾收集.

在wp7中操作图像资源是很费内存的,如果内存超过90M,你的程序就挂了,而我们在XAML文件中定义的Image控件,由于属于静态资源,所以你不可能在后台CS代码中对它们进行image.source = null 操作,我试过,没有用,除非你把Image控件的定义放在CS代码中,这样你执行image.source = null 操作或者将Image控件从LayoutRoot中卸掉:LayoutRoot.Children.Remove(Image), 那么这个image就会被垃圾收集。

因此,对于在XAML文件中定义的图像控件来说,要想释放这些图像所占用的内存,唯一时刻只能是离开这个Page的时刻。所以,一条重要原则就是尽量不要将一个包含大量图像控件的page作为你的MainPage,因为这个Page会等到整个程序结束(exit)的时候才会被释放,你想想,在整个程序运行过程中,这些内存一直被占用着,一旦你再开一个包括许多图像的page,或者你load了其他东西到内存里,你的内存使用很可能会超过90M。

所以建议就是:

1.如果程序有主界面的话,尽量不要在主界面上放太多图像控件。或者说不要将一个拥有大量图像的page作为main page。

2.尽可能将需要播放动画并包含大量图像的page单独做成一个page,播放完毕或者用完就离开这个page

3.Panorama 的background 如果设置成图像image的话,会消耗大量内存,一般24M左右,而且跟是否是jpg或png, 跟图像大小和复杂度也没关系, 我做过试验,唯一能降低内存消耗的方法是讲panorama的高度(height)减小,比如减小一般,那么内存消耗也会减小一般,因为它只绘制了一半在界面上嘛。

你可能会想到将panorama的背景设置成渐变,我试过,这样也会消耗17M内存。如果设置成单色(solid color brush),大约消耗2-3M左右。 唯一不会消耗内存的就是:no background.

因此,请在选用Panorama之前,好好检查一下你的程序当前已经消耗了多少内存。余下的内存还够不够你load 一个panorama大胃王。

4.听说Pivot也是个让人又爱又恨的东西,在你加了很多tab到一个pivot中,而且图像又太多时,它也可能挂。 不过具体情况我还没试,以后再说。

另外,附送一段代码,让你知道在WP7中,如何让你知道每个Page何时被释放?

#if(DEBUG)
        /// <summary>
        /// Add a finalizer to check for memory leaks
        /// </summary>
        ~YourPage()
        {
            System.Diagnostics.Debug.WriteLine("Finalizing " + this.GetType().FullName);
        }
        #endif

你可以将这段代码添加到你的每一个page中,记得修改这个析构函数的名称哦。 那么当这个page被析构的时候,就会在output控制台里看到。

看来很多同学都想知道为什么会有这个限制,那么我就补充一下吧:

这是因为Windows Phone 7的应用程序认证要求规定的,5.2.5规定,任何应用程序不得使用超过90 MB的内存,除非手机的可用内存超过256 MB。

下面是英文详细说明:

5.2.5 Memory Consumption
An application must not exceed 90 MB of RAM usage, except on devices that have more than 256 MB of memory. You can use the DeviceExtendedProperties class to query the amount of memory that is available on the device and modify the application behavior at runtime to take advantage of additional memory. For more information, see the DeviceExtendedProperties class in MSDN.
The DeviceTotalMemory value returned by DeviceExtendedProperties indicates the physical RAM size in bytes. This value is less than the actual amount of device memory. For an application to pass certification, Microsoft recommends that the value returned by ApplicationPeakMemoryUsage is less than 90 MB when the DeviceTotalMemory is less than or equal to 256 MB.

所以说这个脑残的规定实际上是防止你的程序无限制的使用内存从而拖慢整个系统的运行,包括多个程序之间的切换,微软这次就是想让windows phone 7的用户体验更加流畅,由于目前推出的所有型号的wp7手机的RAM都是256MB, 因此如果以后出的手机RAM增加了,可能就不会有这个限制了。

转载于:https://www.cnblogs.com/nio-nio/archive/2010/11/09/1872743.html

关于WP7中的90M内存限制问题及设计原则相关推荐

  1. 数据库中主键和外键的设计原则

    來源:http://www.cnblogs.com/deng02/archive/2009/02/26/1398462.html 主键和外键是把多个表组织为一个有效的关系数据库的粘合剂.主键和外键的设 ...

  2. windows2003中未分页内存泄漏导致服务器不稳定的解决方法

    2015年天互进行了内部员工干货分享计划,让销售.技术.客服.市场.行政五大体系的员工把自己工作中的干货内容分享给大家,共同提高业务能力和工作效率.本篇内容来自虚拟产品部姚运的技术日志分享," ...

  3. Docker中的Java内存消耗优化以及我们如何使用Spring Boot

    ---- / BEGIN/ ---- 如果您的Docker容器占用太多内存而无法达到最佳性能,请阅读下文以了解一个团队如何找到解决方案. 最近,我所在的团队在部署我们的微服务(AWS上Docker中的 ...

  4. linux监测cpu 内存,Linux中CPU与内存性能监测.docx

    Linux中CPU与内存性能监测(出处://chenleixing/article/details 在系统维护的过程中,随时可能有需要查看 CPU 使用率内存使用情况的需要,尤其是涉及到JVM,程序调 ...

  5. “雪花”项目:Microsoft探索在.NET中实现手工内存管理

    来自Microsoft研究院.剑桥大学和普林斯顿大学的一些研究人员构建了一个.NET的分支,实现了在运行时中添加支持手工内存管理的API.研究方法的细节及所获得的性能提升发表在名为"Proj ...

  6. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  7. cuda合并访问的要求_在 CUDA C / C ++ 中使用共享内存

    在 上一篇文章 中,我研究了如何将一组线程访问的全局内存合并到一个事务中,以及对齐和跨步如何影响 CUDA 各代硬件的合并.对于最新版本的 CUDA 硬件,未对齐的数据访问不是一个大问题.然而,不管 ...

  8. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

  9. 如何在Mac上的IntelliJ IDEA中增加IDE内存限制?

    本文翻译自:How to increase IDE memory limit in IntelliJ IDEA on Mac? I'm using IDEA 12 Leda on Mountain L ...

最新文章

  1. .NET2.0抓取网页全部链接【月儿原创】
  2. ASP.NET Core Web Razor Pages系列教程八: 添加验证
  3. html5动态气泡效果6,[jQuery]Canvas气泡动态背景效果
  4. CSS+DIV-公司网站
  5. JVM指令:invokeSpecial/invokeVirtual/invokeStatic/invokeInterface/invokeDynamic方法调用指令
  6. 数据库系统原理(第一章概述)
  7. 微机原理和计算机组成原理一样吗_计算机组成原理:计算机的层次与编程语言...
  8. Java与正则表达式
  9. 关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
  10. 关于消息队列的使用----ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ
  11. 聊一聊2D地图的迷雾效果
  12. Layout自动布局(2)-手写代码
  13. BZOJ4072[Wf2014] baggage
  14. AD库转allegro步骤
  15. 数据库候选关键词怎么求_如何选取关键词?
  16. 墨刀原型设计工具学习体会——临摹网易云音乐App
  17. 计算机中升序符号,电脑excel表格软件中的标点符号怎么快速替换
  18. C/C++:long int与long long的区别
  19. 绕过阿里云盾进行XSS
  20. 计算机如何接6块显卡,双显卡怎么切换到独立显卡 5步轻松搞定【图文教程】

热门文章

  1. 没什么本钱怎么做生意?
  2. 装修弱电箱,路由器和交换机该怎么放?
  3. org.apache.maven.plugins:maven-resources-plugin:2.4.3
  4. grub rescue 修复
  5. 网络嗅探器如何嗅探_SQL Server中的运行时常量嗅探
  6. 提高sql性能的方法_三种提高T-SQL性能的方法
  7. oracle游标fetch_SQL游标@@ FETCH_STATUS函数概述
  8. jquery点击按钮显示和隐藏div
  9. CodeForces 785E Anton and Permutation 分块
  10. python面向对象(下)