【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

时间:2024-05-21 14:29:33

 

Windows Phone 应用内存使用分析技术

 

原文地址:http://www.developer.nokia.com/Community/Wiki/Techniques_for_memory_analysis_of_Windows_Phone_apps

 

第一次尝试翻译 翻译的不好 请见谅

 

该文章主要介绍一些常用的分析Windows Phone 应用内存使用情况的技术


 

 



 

Windows Phone Memory Profiler

 

运行Windows  Phone  Memory Profiler  可以自动分析应用程序内存使用状况并得到一个以时间为轴的图表,其中包括内存开销以及关键事件(垃圾回收、创键映象等)。该工具以及包含在了 Windows Phone SDK 7.1并且可以用于在所有版本的Visual Studio(2010)

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

 

在接下的部分重描述了一个简单的测试程序以在分析时开销和释放一些内存,同时我们将演示如何使用内存分析器


内存分析测试程序

 

我们将创建一个简单Window Phone 7 应用用来演示如何使用内存分析器,该应用将会开销\释放5MB 的内存。

 

(该程序将在文章中用于演示各种内存分析技术)

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

创建一个Window Phone 7.5 工程
打开 MainPage.xaml 用下面的代码覆盖原有的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>

然后 打开MainPage.xaml.cs 复制并粘贴一下代码

 

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 菜单
选择 StartWindows Phone Performance Analysis

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

2、
选择 Memory 然后
点击 Launch Application运行程序

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

 

3、
应用启动后 点击 Add 5MB 4、
过一会儿后 点击 SStop Profiling 这时我们可以看见描述应用程序内存开销的图表,垃圾回收时的标记,我们可以选择一个时间段然后点击 Start Analysis
分析结果显示在所选择的时间区间中以及分配了很多内存。我们同样可以查看堆的使用情况,以了解 Silverlight\CLR 内存分配状况

 

The analysis of the selected time span shows that too manyByte[]have been allocated. We can also examine the Heap Summary as was suggested and see a summary of the Silverlight/CLR memory allocation state.

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

们还可以继续查看在该时间内所开销的内存情况和占总开销的比例。

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

我们同样可以使用Widows Phone 7 Performance Analysis 分析 CPU 使用情况具体内容请看:
How to: Capture and Analyze Performance Data Using WindowsPhone Performance Analysis
(MSDN).





使用Code4fun中的<Memory />

使用Microsoft Code4fun Windows Phone Toolkit 中的 <MemroryCounter />控件
开发应用时显示当前内存使用和最大高峰情况。

 

 

打开工程,并添加 Coding4fun  的程序集,在
coding4funwebsite 有相关如何正确是添加DLL 和引用的介绍。


 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧


在添加玩Coding4Fun.Phone.Controls 程序集引用后你可以添加一个<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时总内存和峰值的变化

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

Adding 5MB

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

Adding 5MB

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

Removeing 5MB

 

注意:<MemoryCounter />的完整描述:
Passing WP7 Memory Consumption requirements with theCoding4Fun MemoryCounter tool

上述的示例代码仅适用于本文的示例


 


创建属于自己的内存分析器

WindowsPhone 提供系统底层的属性,所以我们可以创建我们自己的“伪(pseudo)”内存分析器。这个也许可以满足我们从用户手机上获取内存使用记录的需求。


警告过多的高频率收集内存信息可能其本身会加重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 Phone7.5 中我们可以调用 DeviceExtendedProperties.GetValue (“ApplicationWorkingSetLimit”)以了解在当前设备的应用程序内存限制


警告:如果不是Windows Phone 7.5 那么在调用时将会抛出异常


下面是一个伪(pseudo )内存分析器的实力。他创建了2秒执行一次的异步计时器用来记录内存开销并将其记录到
独立存储中。(后面我看不懂了。。。。大概估计我猜他是说在理想状况下应将记录写到WebServce 不过做示例
就偷了个懒。。。)(
In an ideal world the example would write the report in IsoStore to a web service next time the app restarts - for the sake of brevity this code is omitted.)

 

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 后一会儿的输出记录。我们可以看到debug 的输出记录反映了内存开销情况的变化

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧



使用Windows Phone Marketplace Test Kit

 Windows Phone SDK 7.1 中的Windows PhoneMarketplace Test Kit 包含Peak Memory Consumption 可用来测试应用程序总内存开销的峰值是否小于90MB  我们强烈建议在应用提交Marketplace之前使用MarketplaceTest Kit 进行测试,同时该测试在开发的早期阶段同样有用。

 

 

 

运行Tset1、
右键点击SolutionExplorer 选择 Open Marketpalce Test KitMonitored  Test 中可以看见 PeakMemory Consumption2、
点击 StartApplication 以开始测试3、
使用应用测试公共。4、
点击 CloseApplication 以结束测试。 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

 

如果应用程序一旦使用内存超过90 MB 测试将未通过

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

更多关于 Marketplace Test Kit 的信息请看
Get Your Windows Phone Applications in the Marketplace Faster
(CherylSimmons) and
Windows Phone Marketplace Test Kit
(MSDN)

 



 

APP HUB 崩溃记录

 

当客户手机上的应用程序崩溃后崩溃记录
将发回APPHUB. 如果在你的崩溃报告中有OutOfMemoryExeption 那么就意味着
你的应用有内存问题需要修复 你可以在 APPHUB 中查看你的应用崩溃记录报告,并可根据日期过滤记录。崩溃报告包括所发生的异常,引发该异常的堆栈跟踪记录
例如下面的截图告诉我们一个OutOfMemeoryExcepiton 已经发生了18 已经异常抛出时的堆栈记录

 

【译】Nokia 开发者社区文章:Windows Phone 应用内存分析的技巧

忠告:不要依赖于查看AppHub 崩溃报告的方式来检查你的设备是否适用于256MB 的设备。首先他会带来很糟糕的用户体验,其次 AppHub 不可保证其会检测到所有OutOfMemoryExceptions 。


本文同步发表于 Windows Phone Developer Network : http://www.wpdevn.com/showtopic-50.aspx





转载于:https://www.cnblogs.com/JerryH/archive/2012/03/08/2384578.html