×
Namespaces

Variants
Actions

Windows Phone 应用程序内存分析技术

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon Bug.png
WP Metro Icon Tools.png
WP Metro Icon Graph1.png
SignpostIcon XAML 40.png
WP Metro Icon XNA.png
SignpostIcon WP7 70px.png
Article Metadata

兼容于
文章
翻译:
最后由 hamishwillee 在 04 Jul 2013 编辑

本文提供对Windows Phone应用程序的内存使用分析技术的概述。

Contents

Windows Phone Memory Profiler

通过运行Windows Phone Memory Profiler 可以获得应用程序的内存消耗的时间轴图,重要事件的故障(垃圾回收,图像创建等),还可以自动分析你的应用程序的内存使用。分析器包含在Windows Phone SDK7.1中,可以在任意版本上的Visual Studio上运行。

Windows Phone Memory Profiler screenshot.png

下面的部分描述了一个简单的测试程序,通过它可以实现在分析时分配和释放内存,余下的内容是展示如何使用内存分析。

内存分析测试示例程序

要演示分析器是如何工作的,首先需要创建一个一次可以分配和释放5MB 内存的Windows Phone 7 示例应用程序。此示例应用程序用于在整篇文章中演示不同的内存分析技术。

WindowsPhoneMemoryTextExample2.png

安装Windows Phone SDK 7.1.1后,新创建一个Windows Phone 7.5 工程。打开MainPage.xaml,用 stackpanel and 2 个按钮替换已存在的“ContentPanel”。

<!--ContentPanel - place additional content here-->
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Add 5MB" Click="Add_Click" />
<Button Content="Remove 5MB" Click="Remove_Click" />
</StackPanel>

接下来,在in MainPage.xaml.cs 里实现分配和释放5MB内存的事件处理程序。

List<Byte[]> inMemoryCache = new List<byte[]>();
 
private void Add_Click(object sender, RoutedEventArgs e)
{
inMemoryCache.Add(new Byte[1024 * 1024 * 5]);
}
 
private void Remove_Click(object sender, RoutedEventArgs e)
{
if (inMemoryCache.Count > 0)
inMemoryCache.RemoveAt(inMemoryCache.Count - 1);
GC.Collect();
}

分析

启动内存分析: 1. 打开顶端的Debug菜单项,选择Start Windows Phone Performance Analysis.

WindowsPhoneStartWindowsPhonePerformanceAnalysis.png

  • 确认选择"Memory"分析,然后选择Launch Application。

WindowsPhoneStartWindowsPhonePerformanceAnalysisMemoryNotExecution.png

2. 当应用程序运行起来之后,点击几次Add 5MB 按钮。 3. 然后选择停止分析。 这时你可以看到应用程序的内存分配图和垃圾回收发生时的标记。可以选择你感兴趣的时间跨度,选择Start Analysis。

Windows Phone Memory Profiler screenshot.png

所选时段的分析显示已分配了太多的Byte[]。作为建议,我们也可以研究一下Heap Summary和Silverlight/CLR内存分配状态总结。

WindowsPhoneMemoryProfilerAnalysis.png

查看详细情况来了解在这段时间内分配了多少Byte[] ,他们总的分配率是多少(%)。

WindowsPhoneMemoryProfilerAnalysisDrilldown.png

还可以在CPU分析上使用Windows Phone 7 性能分析。 更多地信息可以参考How to: Capture and Analyze Performance Data Using Windows Phone Performance Analysis (MSDN)

Add on-screen coding4fun <MemoryCounter />

在微软的coding4fun Windows Phone Toolkit上使用<MemoryCounter />控件可以显示在开发你自己的应用程序时当前的内存使用和峰值内存。

要使用它可以通过在工程里增加 Coding4fun assembly。coding4fun website的网站上有怎样在工程里加入正确DLL的说明,可以通过增加引用或者使用NuGet实现。

WindowsPhoneCodingForFunPhoneControls.png

在工程里添加Coding4Fun.Phone.Controls assembly 引用后,现在可以在你的页面上添加<MemoryCounter />。

<!--ContentPanel - place additional content here-->
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Add 5MB" Click="Add_Click" />
<Button Content="Remove 5MB" Click="Remove_Click" />
</StackPanel>
<coding4fun:MemoryCounter
xmlns:coding4fun="clr-namespace:Coding4Fun.Phone.Controls;assembly=Coding4Fun.Phone.Controls"/>

下面的截图展示了刚才的代码在我们的示例测试程序里的运行情况。注意当用户点击Add 5mb和Remove 5mb按钮时,总的内存和峰值内存是怎样变化的。

WindowsPhoneMemoryTextExample1.pngWindowsPhoneMemoryTextExample2.pngWindowsPhoneMemoryTextExample3.png

Note: Passing WP7 Memory Consumption requirements with the Coding4Fun MemoryCounter tool(WindowsPhoneGeek)详细说明了<MemoryCounter />. 上面的示例代码实际上是改编自那篇原文中的示例代码)

创建自己的内存分析器

Windows Phone支持底层的报告属性,你可以使用它来创建自己的“伪”内存分析器。如果你想从消费类电子设备上获得内存分析日志这可能是有用的。

Warning: 当部署自己的内存分析器时需要注意,过度内存条件采样可能会对内存和CPU的性能产生影响。 DeviceStatus类需要有4个属性:

namespace Microsoft.Phone.Info
{
public static class DeviceStatus
{
public static long ApplicationCurrentMemoryUsage { get; }
public static long ApplicationPeakMemoryUsage { get; }
public static long ApplicationMemoryUsageLimit { get; }
public static long DeviceTotalMemory { get; }
}
}

此外,在Windows Phone 7.5升级版本里,你可以调用DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit")获得当前设备的内存工作设置限制。

Warning: 注意如果Windows Phone 7.5升级版没有安装的话,调用GetValue()会抛出一个异常。

下面是一个伪内存分析器示例。它创建了一个每2秒记录内存情况并把他们写到一个在IsoStore的报告里面的异步定时器。在理想情况下下一次应用程序重启时这个例子会把在IsoStore的报告写到web service里面-为简洁起见,省略此处代码。

public static class LowMemoryHelper
{
private static Timer timer = null;
 
public static void BeginRecording()
{
// before we start recording we can clean up the previous session.
// e.g. Get a logging file from IsoStore and upload to the server
 
// start a timer to report memory conditions every 2 seconds
timer = new Timer(state =>
{
// every 2 seconds do something
string report =
DateTime.Now.ToLongTimeString() + " memory conditions: " +
Environment.NewLine +
"\tApplicationCurrentMemoryUsage: " +
DeviceStatus.ApplicationCurrentMemoryUsage +
Environment.NewLine +
"\tApplicationPeakMemoryUsage: " +
DeviceStatus.ApplicationPeakMemoryUsage +
Environment.NewLine +
"\tApplicationMemoryUsageLimit: " +
DeviceStatus.ApplicationMemoryUsageLimit +
Environment.NewLine +
"\tDeviceTotalMemory: " + DeviceStatus.DeviceTotalMemory + Environment.NewLine +
"\tApplicationWorkingSetLimit: " +
DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit") +
Environment.NewLine;
 
// write to IsoStore or debug conolse
Debug.WriteLine(report);
},
null,
TimeSpan.FromSeconds(2),
TimeSpan.FromSeconds(2));
}
}
 
// Code to execute when the application is launching (eg, from Start)
// This code will not execute when the application is reactivated
private void Application_Launching(object sender, LaunchingEventArgs e)
{
LowMemoryHelper.BeginRecording();
}

下面是在示例程序中当用户点击Add 5MB按钮几次后的输出内容,通过它可以看到内存调试的输出反映了这些变化。

WindowsPhoneMemoryProfileHomeGrownExample.png

Note: 前面所描述的部分仅仅是一个伪内存分析器,和下面链接里所描述的相似。<MemoryCounter />完整的源代码实现在这里

Run the Windows Phone Marketplace Test Kit

Windows Phone SDK 7.1的Windows Phone Marketplace Test Kit包含了显示应用程序总的峰值内存是否在90MB以下的峰值内存使用测试。虽然我们强烈建议在市场提交之前在应用程序上运行Marketplace Test Kit,但是在开发的早期阶段,这些测试也是非常有用的。

运行测试:

  • 在Solution Explorer里右击你的工程,选择Open Marketplace Test Kit
  • 在Monitored Tests下你可以看到Peak Memory Consumption 测试
  • 点击Start Application运行测试
  • 测试所有的应用程序功能
  • 点击Close Application结束测试

WindowsPhoneMarketplaceTestKit.png

如果你的应用程序在任意一刻使用的内存超过90MB,则会报告出一个错误,如下图所示。

Windows Phone Marketplace Test Kit Peak Memeory Consumption.png

想要获得更多的Marketplace Test Kit和内存测试信息可以参考Get Your Windows Phone Applications in the Marketplace Faster (Cheryl Simmons)Windows Phone Marketplace Test Kit (MSDN)

检测AppHub崩溃报告

不管什么时候,当部署好的应用程序在消费电子设备上崩溃了,将会发回一个崩溃的报告给AppHub。AppHub崩溃报告里会有一个OutOfMemoryException指出你的应用程序有内存问题,需要被修复。 你可以用你的AppHub账户检测应用程序的崩溃报告,通过过滤报告只显示发生在特定时间内的崩溃。报告的内容包含产生了什么样的异常,在什么函数里面,随着函数调用的堆栈追踪到错误所在。举一个例子,下面的截图展示了一个真实的报告里发生的18次OutOfMemoryException,还有相关联的堆栈追踪。

Windows Phone AppHub crash report.png

Tip: 不要依赖于AppHub崩溃报告的方式在256MB的设备上来验证你的应用程序!首先,在你的用户有一个坏的体验之前检测出错误会更好,其次不能保证AppHub可以检测出所有的OutOfMemoryExceptions。

不管怎样,当你看见错误时就意味着需要更多的工作了!

This page was last modified on 4 July 2013, at 03:40.
135 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×