我支持 WM6 平台上的“旧”移动应用程序。我们最近不得不升级到新设备,因为旧设备不再可用。这也意味着从 WM6.1 升级到 WM6.5,以及从 .NET CF 2.0 到 3.5。
此应用程序的主要问题是持续的内存压力 (OutOfMemoryExceptions)。我确实尝试修复内存泄漏,并针对内存消耗优化了某些代码。但是,在新设备上,整个情况比旧设备要糟糕得多。我知道每个进程都有 32MB 的虚拟内存限制,无论有多少可用的物理内存( interesting read )。
我用过 VirtualMemory.exe和 Motorola eMScript 来可视化/分析我的应用程序的 32MB 内存插槽。这就是进程虚拟内存的样子(总共 32MB,每个灰色条代表 1MB,顶部是新设备,底部是旧设备)。红色条右侧的所有内容都是第三方 DLL(操作系统、供应商等)。通过切换到新设备,我们又损失了 3MB。
应用程序似乎遇到了“DLL 紧缩”问题,即某些第三方 DLL 占用了右侧的虚拟内存地址(最高地址)。注意:左边的蓝色条被 .exe 占用,我可以使用 this awesome trick 消除它.
所以这是我的问题:如何确定哪些 DLL 占用了我的地址空间?我尝试了 eMScript,它提供了一个包含所有 DLL 及其地址的列表,但没有提供红色栏右侧的列表(共享 DLL)。
是否有任何关于如何减少丢失的地址空间量的一般建议或提示?有人建议使用“简化的图形驱动程序”,但我还不相信这会解决正确的问题。
新设备是摩托罗拉 MC65,以防万一。
最佳答案
要提高 .NET CF 应用程序可用的内存,您可以实现文章 MemMaker for the .NET Compact Framework 中介绍的技巧。 :
将所有托管代码从 EXE 移到 DLL 中 .这可以帮助您释放 32MB 插槽中的一些内存。
其他相关文章是杀死虚拟内存怪物 :
关于windows-mobile - Windows Mobile : How to identify and prevent shared DLLs from occupying address space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17964201/