发表于 MS 论坛移动工作者模块见解
技术栈: 软件:Visual Studio 2008, .NET Framework 3.5, Windows Mobile 6.5.3, SQLite Database, RESCO UI 控件
硬件:霍尼韦尔海豚99EX设备 处理器:德州仪器® OMAP3715 1.0GHz处理器 操作系统:Microsoft® Windows Embedded Handheld 6.5 Professional和Classic 内存:512 MB 内存 x 1 GB 闪存
问题域:当我们在手持设备上运行应用程序时,分配给应用程序的程序内存(32MB(被填满并重新启动手持设备。 没有增加此型号设备的程序内存(虚拟内存(的规定。
-
移动工作人员应用程序开始使用设备上剩余的大约 12-14 MB 虚拟内存。
-
其余部分用于应用程序启动和其他启动过程。
-
当用户继续执行其任务(打开表单(时,每个任务的内存几乎开始逐渐减少,平均减少 .20 MB。当该页面上的任务完成时,我们将关闭表单。但是,在数据排序规则绑定期间或从 SQL lite 选择过程中消耗 1 MB 内存的进程很少。
-
如果用户保持在同一流上或处理相同的表单,则虚拟内存将保持在 5MB。但是,如果用户离开当前流并输入需要打开新表单的新流,则它开始减少到 5MB 以上。
-
从这里开始,当工作线程打开一个新的进程时,内存会减少并下降到零。这会导致应用程序崩溃并重新启动。
以下是我们启动设备时的内存日志。 400 个物理内存中剩余 300 个,32 MB 虚拟内存中剩余 24 MB
-
应用程序成功启动时的内存状态:- 300.79/420.94 (MB(物理, 24.44/32.00 (MB(虚拟
-
创建 SQL lite 表后的内存状态,在成功启动 ECD 应用程序后自动触发 290.45/420.94 (MB(物理, 16.25/32.00 (MB(虚拟
新 HH 寄存器进程 后的内存状态,与设备一样,寄存器设备进程运行并消耗了大约 2 MB:- 288.60/420.94 (MB(物理, 14.50/32.00 (MB(虚拟
主管登录后的内存状态:- 281.88/420.94 (MB(物理, 12.06/32.00 (MB(虚拟
主管开始执行不同的操作,内存利用率逐渐开始上升,并逐渐降至零: 停靠视图集合绑定后的内存状态。 271.11/420.94 (MB( 物理,9.00/32.00 (MB( 虚拟。
代码中有内存泄漏。
要释放表单使用的内存,请释放,然后设置为空,然后是 GC。收集以强制内存垃圾回收。在代码显式释放其他对象后,也可以对它们执行此操作。
可以通过将代码移动到 .NET 库中来释放内存。从 Windows Mobile 6.5 开始,点网库不会完全加载到进程槽内存(32MB 减去 DLL(中(请参阅 https://blogs.msdn.microsoft.com/robtiffany/2009/04/09/memmaker-for-the-net-compact-framework/(。
如果内存泄漏在 DotNet 对象内部,则可以使用远程性能监视器(即在此处 https://blogs.msdn.microsoft.com/stevenpr/2007/03/08/finding-managed-memory-leaks-using-the-net-cf-remote-performance-monitor/和 http://gruffcode.com/2012/12/27/finding-memory-leaks-in-net-compact-framework-applications/
如果内存泄漏在本机库中,则需要检查代码中是否缺少 free(( 语句或已分配但在使用后未释放的对象(即字体、位图、画笔等(。