我正在尝试分析我们的 Windows Phone 7 应用程序的内存使用情况。在浸泡测试后查询该ApplicationPeakMemoryUsage
属性会产生约 90Mb 的值。System.GC.GetTotalMemory(true)
此时返回 ~11Mb,因此余额必须是非托管内存。该应用程序没有明确分配任何非托管内存,因此我假设平衡是 GPU 资产、音频和应用程序二进制文件本身。
通过围绕调用ContentManager.Load()
和 GPU 资源分配(new RenderTarget2D()
等)。代码类似于
System.GC.Collect();
unused = System.GC.GetTotalMemory(true);
GC.WaitForPendingFinalizers();
long mem = ((long)Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage"));
.
. // perform loads/allocations
.
mem = ((long)Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage")) - mem;
我能够获得渲染缓冲区、纹理/音频资源等使用的内存的近似数字。这些在我的应用程序中总计约 45-50Mb。ApplicationCurrentMemoryUsage
在初始化开始时立即产生不到 10Mb。减去 11Mb 托管堆(这部分是重复计算的!),这留下约 20Mb 下落不明。
Mango 内存分析器跟踪总数,但只分解托管堆的分配。除了 GPU 资源、音频和应用程序二进制文件本身之外,还有什么可能会使用大量非托管内存?有没有比我现在做的更明智的跟踪记忆的工具或方法?