我支持 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,以防万一。