windows-mobile - Windows Mobile : How to identify and prevent shared DLLs from occupying address space?

标签 windows-mobile compact-framework virtual-memory windows-mobile-6.5

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

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

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

virtual memory map

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

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

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

最佳答案

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

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

  • Part 1
  • Part 2
  • 关于windows-mobile - Windows Mobile : How to identify and prevent shared DLLs from occupying address space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17964201/

    相关文章:

    linux - 如何减少 gccgo 编译的可执行文件所需的虚拟内存?

    .NET 紧凑框架中的 WCF 托管

    performance - 在什么情况下大页面可以提高速度?

    windows-mobile - Windows Phone 7 开发,与版本 6.x 有何不同?

    windows - Windows Mobile应用程序的GUI测试工具

    C# .NET 套接字连接问题 - 通常只允许每个套接字地址使用一次

    c# - 将记录插入到 SQL Server CE 数据库移动到另一个线程? C# Compact Framework 3.5

    c++ - 为什么我不能在同一个分配中保留两个连续的内存区域而不用一次调用保留它们?

    c++ - 如何将 wince sdk 6 添加到嵌入式 Visual C++ 4?

    windows-phone-7 - 如何在 Windows Phone 7 的后退导航中跳过一个页面