内存分析工具和方法

时间:2011-09-13 15:45:59

标签: windows-phone-7 memory-profiling

我正在尝试分析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资源,音频和应用程序二进制本身之外,还有什么可能使用大量非托管内存?有没有更合理的工具或方法来跟踪记忆而不是我正在做的事情?

2 个答案:

答案 0 :(得分:1)

下载的文件(包括来自网络的图片)可能会占用大量内存。如果您正在使用它们,请务必再次正确释放内存(请参阅http://blogs.msdn.com/b/swick/archive/2011/04/07/image-tips-for-windows-phone-7.aspx)。

答案 1 :(得分:0)

您使用的是WebBrowser控件吗?

它有一些缺陷,并且在某些情况下会导致巨大(和增量)内存泄漏,特别是如果页面包含许多媒体或复杂脚本,或者其页面重新加载/更改时不幸的时间......