0

发表在 MS 论坛Mobile Worker 模块见解

技术堆栈:软件:Visual Studio 2008、.NET Framework 3.5、Windows Mobile 6.5.3、SQLite 数据库、RESCO UI 控件

硬件:Honeywell Dolphin 99EX 设备处理器:Texas Instruments® OMAP3715 1.0GHz 处理器操作系统:Microsoft® Windows Embedded Handheld 6.5 Professional 和 Classic 内存:512 MB RAM x 1 GB Flash

问题域:当我们在手持设备上运行应用程序时,分配给应用程序的程序内存 (32MB) 被填满并且手持设备被重新启动。没有为该型号设备增加程序内存(虚拟内存)的规定。

  • 移动工作人员应用程序开始使用设备上剩余的大约 12-14 MB 虚拟内存。

  • Rest 用于应用程序启动和其他启动过程。

  • 随着用户继续他们的任务(打开表单),几乎每个任务的内存开始逐渐减少,平均为 0.20 MB。在该页面上完成任务后,我们将关闭表单。但是,在数据整理绑定期间或从 SQL lite 选择进程期间,很少有进程消耗 1 MB 内存。

  • 如果用户停留在相同的流程或使用相同的表单,则虚拟内存保持在 5MB。但是,如果用户离开当前流程并进入需要打开新表单的新流程,它就会开始减少超过 5MB。

  • 从这里开始,随着工人打开一个新进程,内存减少并降为零。这会导致应用程序崩溃并重新启动。

下面是我们启动设备时的内存日志。400 物理内存中剩余 300 和 32 MB 虚拟内存中剩余 24 MB

  • 成功启动应用程序时的内存状态:- 300.79/420.94 (MB)Phys, 24.44 /32.00 (MB)Virtual

  • 成功启动 ECD 应用程序后自动触发的 SQL lite 表创建后的内存状态 290.45/420.94 (MB)Phys, 16.25 /32.00 (MB)Virtual

  • 新 HH 注册进程后的内存状态,与设备一样,注册设备进程运行并消耗大约 2 MB:- 288.60/420.94 (MB)Phys, 14.50 /32.00 (MB)Virtual

  • 管理员登录后的内存状态:- 281.88/420.94 (MB)Phys, 12.06 /32.00 (MB)Virtual

  • Supervisor 开始执行不同的操作,内存利用率逐渐开始上升并逐渐下降到零:- Dock 视图集合绑定后的内存状态。271.11/420.94 (MB) 物理,9.00 /32.00 (MB) 虚拟。


4

1 回答 1

0

您的代码中有内存泄漏。

要释放表单使用的内存,请执行 Dispose,然后设置为 null,然后 GC.Collect 强制进行内存垃圾收集。在通过代码显式处理它们之后,也对其他对象执行此操作。

您可以通过将代码移动到 .NET 库中来释放内存。从 Windows Mobile 6.5 开始,Dot Net 库不会完全加载到进程槽内存(32MB 减去 DLL)中(请参阅https://blogs.msdn.microsoft.com/robtiffany/2009/04/09/memmaker-for-the-网络紧凑框架/)。

如果内存泄漏在 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() 语句或已分配但在使用后未释放的对象(即字体、位图、画笔等)。

于 2017-08-06T05:46:20.257 回答