我在WM6平台上支持“旧”移动应用程序。我们最近不得不升级到新设备,因为旧设备不再可用。这也意味着从WM6.1升级到WM6.5,从.NET CF 2.0升级到3.5。
此应用程序的主要问题是常量内存压力(OutOfMemoryExceptions)。我确实尝试修复内存泄漏,并优化了某些内存消耗代码。然而,在新设备上,整个情况比旧设备更糟糕。我知道每个进程都有32MB的虚拟内存限制,无论可用的物理内存量是多少(interesting read)。
我使用VirtualMemory.exe和Motorola eMScript来可视化/分析我的应用程序的32MB内存插槽。这就是进程虚拟内存的样子(总共32MB,每个灰条代表1MB,top是新设备,bottom是旧设备)。红条右侧的所有内容都是第三方DLL(操作系统,供应商,...)。通过切换到新设备,我们又损失了3MB。
似乎应用程序遇到了“DLL crunch”问题,其中一些第三方DLL占用了右侧的虚拟内存地址(最高地址)。注意:左侧的蓝色栏由.exe占用,我可以使用this awesome trick消除它。
所以这是我的问题:如何识别哪些DLL占用了我的地址空间?我尝试了eMScript,它给出了一个包含所有DLL和地址的列表,但不是红色栏右侧的那些(共享DLL)。 关于如何减少这个丢失的地址空间,是否有任何一般性建议或提示?有人建议使用“缩小图形驱动程序”,但我还不相信这会解决正确的问题。
新设备是摩托罗拉MC65,如果这是相关的。
答案 0 :(得分: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处理插槽。
答案 1 :(得分:0)
为了改善.NET CF应用程序可用的内存,您可以实现文章MemMaker for the .NET Compact Framework中解释的技巧: 将所有托管代码从EXE移到DLL中。这可以帮助您在32MB插槽中释放一些内存。
其他相关文章杀死虚拟记忆怪物: