Windows mobile Windows Mobile:如何识别和防止共享DLL占用地址空间?

Windows mobile Windows Mobile:如何识别和防止共享DLL占用地址空间?,windows-mobile,compact-framework,virtual-memory,windows-mobile-6.5,Windows Mobile,Compact Framework,Virtual Memory,Windows Mobile 6.5,我支持WM6平台上的“旧”移动应用程序。我们最近不得不升级到新设备,因为旧设备不再可用。这也意味着要从WM6.1升级到WM6.5,以及从.NET CF 2.0升级到3.5 此应用程序的主要问题是恒定的内存压力(OutOfMemoryExceptions)。我确实试图修复内存泄漏,并针对内存消耗优化了某些代码。然而,在新设备上,整个情况比旧设备要糟糕得多。我知道每个进程都有32MB的虚拟内存限制,不管有多少物理内存可用() 我使用Motorola和eMScript可视化/分析我的应用程序的32MB

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

此应用程序的主要问题是恒定的内存压力(OutOfMemoryExceptions)。我确实试图修复内存泄漏,并针对内存消耗优化了某些代码。然而,在新设备上,整个情况比旧设备要糟糕得多。我知道每个进程都有32MB的虚拟内存限制,不管有多少物理内存可用()

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

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

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


新设备是摩托罗拉MC65,以防与此相关。

好问题和信息。请参阅我的>注释

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

试着找一份devhealth的副本。它是一个MS工具,用于列出所有DLL及其地址和引用。另见

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

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


为了提高.NET CF应用程序的可用内存,您可以实现本文中介绍的技巧: 将所有托管代码从EXE移到DLL中。这可以帮助您在32MB插槽中释放一些内存

其他相关文章是《杀死虚拟内存怪物》


好的,我在网上的某个地方找到了DevHealth。。。但是,我找不到查看器,如果没有它,解释这个巨大的ASCII文件是不可能的。我了解到它包含在Windows Mobile适配套件中,但您需要与Microsoft签订OEM协议。请重试hxxp://en.pudn.com/dl.asp?id=2329891