4

我支持 WM6 平台上的“旧”移动应用程序。我们最近不得不升级到新设备,因为旧设备不再可用。这也意味着从 WM6.1 升级到 WM6.5,以及从 .NET CF 2.0 升级到 3.5。

此应用程序的主要问题是持续的内存压力 (OutOfMemoryExceptions)。我确实尝试修复内存泄漏,并优化了某些代码以消耗内存。但是,在新设备上,整个情况比旧设备要糟糕得多。我知道每个进程都有 32MB 的虚拟内存限制,无论有多少物理内存可用(有趣的阅读)。

我使用VirtualMemory.exe和 Motorola eMScript 来可视化/分析我的应用程序的 32MB 内存插槽。这是进程虚拟内存的样子(总共32MB,每个灰色条代表1MB,顶部是新设备,底部是旧设备)。红条右侧的所有内容都是第三方 DLL(操作系统、供应商...)。通过切换到新设备,我们又损失了 3MB。

虚拟内存映射

似乎该应用程序正在遭受“DLL 紧缩”问题,其中一些第三方 DLL 占用右侧的虚拟内存地址(最高地址)。注意:左边的蓝色条被 .exe 占据,我可以使用这个很棒的技巧来消除它。

所以这是我的问题:如何确定哪些 DLL 占用了我的地址空间?我尝试了 eMScript,它提供了一个包含所有 DLL 及其地址的列表,但不是红条右侧的那些(共享 DLL)。对于如何减少丢失的地址空间量,是否有任何一般性建议或提示?有人建议使用“简化的图形驱动程序”,但我还不相信这会解决正确的问题。

新设备是摩托罗拉 MC65,以防万一。

4

2 回答 2

0

很好的问题和信息。请参阅我的 > 笔记。

“...如何确定哪些 DLL 占用了我的地址空间?我尝试了 eMScript,它提供了一个包含所有 DLL 及其地址的列表,但不是红色条右侧的那些(共享 DLL)。”

尝试查找 devhealth 的副本。它是一个 MS 工具,用于列出所有 DLL 以及地址和参考。另见http://www.hjgode.de/wp/2009/05/27/managed-application-suddenly-fails-to-invoke-dlls/

“关于如何减少丢失的地址空间量,是否有任何一般性建议或提示?”

其中一些 DLL 由驱动程序和后台进程加载。您可以通过禁用一个或其他应用程序的启动来“消除”其中一些。但我担心设备/操作系统需要它们中的大多数。一般来说,WM653 设备上的内存情况应该比 WM61 上的要好。MS 添加了一些额外的“内存保护程序”。但是新的操作系统也带有新的功能和服务,所以“内存增强”是不可能的。如果您无法删除驱动程序/应用程序,则应将单个应用程序拆分为多个进程。例如,如果您有使用相机的拍照功能,则将其拆分为单独的应用程序,它将获得自己的 32MB 进程插槽。

于 2013-08-01T04:08:30.610 回答
0

要提高 .NET CF 应用程序的可用内存,您可以实施文章MemMaker for the .NET Compact Framework中解释的技巧: 将所有托管代码从 EXE 移出到 DLL中。这可以帮助您释放 32MB 插槽中的一些内存。

其他相关文章是Slaying the Virtual Memory Monster

于 2013-09-21T19:06:47.980 回答