Passing WP7 Memory Consumption requirements with the Coding4Fun MemoryCounter tool
published on: 2/18/2011 | Views: N/A | Tags: C4FToolkit
by WindowsPhoneGeek
In this article I am going to talk about Memory Consumption in Windows Phone 7 and mainly about the new Memory Counter control from the Coding4fun toolkit.
If you have been developing Windows Phone 7 applications you will probably be aware of the 90 MB memory usage limitation detailed in the application certification requirements.
According to the latest version of the Windows Phone 7 Application Certification Requirements (Here's a direct link to the PDF file):
5.2.5 Memory Consumption
An application must not exceed 90 MB of RAM usage, except on devices that have more than 256 MB of memory. You can use the DeviceExtendedProperties class to query the amount of memory that is available on the device and modify the application behavior at runtime to take advantage of additional memory. For more information, see the DeviceExtendedProperties class in MSDN.
The DeviceTotalMemory value returned by DeviceExtendedProperties indicates the physical RAM size in bytes. This value is less than the actual amount of device memory. For an application to pass certification, Microsoft recommends that the value returned by ApplicationPeakMemoryUsage is less than 90 MB when the DeviceTotalMemory is less than or equal to 256 MB.
So, if your app is close to or exceeds that limit you will probably have problems when you submit your app. How can you test that your app is within the limits?
Here are some solutions:
- DeviceExtendedProperties class - One solution could be to use the DeviceExtendedProperties class . For more information and example take a look at our article: On Testing Windows Phone 7 Applications - Part II: Dealing with the WP7 Application Model.
- Coding4fun Memory Counter control - this is a very helpful tool that can show you at any time the current memory consumption - current memory and peak memory . In this article I will explain all about this new control in details.
Getting Started with Coding4Fun MemoryCounter Control
Basic visual structure:
MemoryCounter control gives you an easy way to monitor the total memory usage of your application. In order to pass the certification requirement monitoring the memory usage can be crucial.
In order to start using this component first add a reference to the Coding4Fun.Phone.Controls.dll assembly.
NOTE: You have to download and rebuild the Coding4Fun Toolkit project in order to generate the assembly.
To use the MemoryCounter in the XAML you have to add the following namespace declaration:
xmlns:Controls="clr-namespace:Coding4Fun.Phone.Controls;assembly=Coding4Fun.Phone.Controls"
You can use this control either declared in XAMl or C#. The sample code should looks like:
XAML:
<Controls:MemoryCounter/>
C#:
public MainPage()
{
InitializeComponent();
MemoryCounter counter = new MemoryCounter();
this.ContentPanel.Children.Add(counter);
}
NOTE: You can see the MemoryCounter results only in DEBUG mode!
Key Concepts and API
MemoryCounter derives from Control and exposes the following public properties:
- UpdateInterval
This is a dependency property of type int. It gets or sets the UpdateInterval of the MemoryCounter control. the default value is 1000.
- CurrentMemory
This is a dependency property of type string. It gets or sets the CurrentMemory value.
- PeakMemory
This is a dependency property of type string. It gets or sets the PeakMemory value.
Here are some questions/answers related to the MemoryCounter control (posted in the Coding4fun toolkit page).
Won't the memory control cause "Device Identity" to show up in Zune Marketplace?
It shouldn't (unless you're doing something else that does) since I'm using reflection and using a Debugger.IsAttached property. The "ApplicationCurrentMemoryUsage" call doesn't require ID_CAP_IDENTITY_DEVICE flag in the manifest but the CapTool sees that call DeviceExtendedProperties.GetValue() and will say you do need that flag. Since this control should only be seen if executed with a debugger attached (aka from Visual Studio), you can leave it in the application with no bad side effects.
More so, one cannot use this "trick" to break out of the Least Privileged Chamber. You can still only use phone functionality that you have capabilities for. Try the same with "DeviceUniqueId" to see that it won't work, while "ApplicationCurrentMemoryUsage" will work if your application doesn't have the ID_CAP_IDENTITY_DEVICE.
Why does the memory control have a try catch?
For some reason after a certain period of time/calls, the invoke call stops working. This bug has been logged. To counter this, if an exception is thrown, the memory control shuts itself off and stops updating to prevent further exceptions being thrown.
Sample usage
Lets create a sample Windows Phone 7 application project and add the following code into MainPage.xaml:
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Add 2mb" Click="Add_Click" />
<Button Content="Remove 2mb" Click="Remove_Click" />
</StackPanel>
<Controls:MemoryCounter/>
In order to simulate different Memory Usage so that we could be able to see the Memory Counter in action we will add some more code to add/remove memory:
public partial class MainPage : PhoneApplicationPage
{
// Constructor
public MainPage()
{
InitializeComponent();
}
List<Byte[]> _memory = new List<byte[]>();
private void Add_Click(object sender, RoutedEventArgs e)
{
_memory.Add(new Byte[1024 * 1024 * 2]);
}
private void Remove_Click(object sender, RoutedEventArgs e)
{
if (_memory.Count > 0)
_memory.RemoveAt(_memory.Count - 1);
GC.Collect();
}
}
The result is:
So in in order to monitor the memory usage of your app just add an instance of MemoryCounter somewhere in your app.
NOTE: You can see the MemoryCounter results only in DEBUG mode!
Once again do not forget:
1. Make sure your memory usage is below 90MB.
2. Always check your memory usage while you're developing your app.
That was all about the MemoryCounter control from the Coding4fun Toolkit in depth.
You can find the full source code here:
I hope that the article was helpful.
You can also follow us on Twitter @winphonegeek
Comments
Great Very helpful
posted by: PK Gerge on 2/20/2011 9:48:32 PM
Thanks alot for sharing such type of real information :) Its very help to my app which is almost ready for market place! :)
For my 2nd app, I am looking for a calender control as same as in windows phone7. Any information...pls suggest me.
Thanks & waiting for yr needful suggestion :)
Cheers!!!! for your next upcoming article!
Re: Calendar control
posted by: windowsphonegeek on 2/20/2011 9:58:18 PM
Currently there is no calendar control built in. However here are some FREE third party Windows Phone 7 calendar controls that you could use:
Re: Calendar control
posted by: PK Gerge on 2/22/2011 12:34:10 AM
Many thanks for Sharing this pretty cool control. :) Thanks!
Can you please share the code project for pickers {Date,time{Hour,Min,SS},Weight {pound, CM} etc..}..if please guide me!
Many thanks for your forward support & Really great Works!
Thanks!
Re: DateTime controls
posted by: windowsphonegeek on 2/22/2011 3:36:08 PM
Here are our suggestions for the Best and FREE DateTime/Selector controls:
1) Silverlight for Windows Phone Toolkit
DatePicker
TimePicker
LoopingSelector
For more info check these articles:
WP7 DatePicker and TimePicker in depth | API and Customization
WP7 LoopingSelector in depth | Part1: Visual structure and API
WP7 LoopingSelector in depth | Part2: Implementing a generic LoopingSelectorDataSource
WP7 LoopingSelector in depth | Part3: Advanced data binding
2) Coding4Fun toolkit
- TimeSpanPicker
For more info check this post:
Our Top Articles & Free books
- Our FREE e-book: "Windows Phone Toolkit In Depth" 2nd edition
- 400+ Windows Phone Development articles in our Article Index
- 21 WP7 Toolkit in Depth articles covering all controls
- 12 WP7 Coding4Fun Toolkit in Depth articles covering all controls
- Performance Tips when creating WP7 apps
- Creating a WP7 Custom Control in 7 Steps
- WP7 working with VisualStates: How to make a ToggleSwitch from CheckBox
- What makes a WP7 App successful
- Creating theme friendly UI in WP7 using OpacityMask
- Implementing Windows Phone 7 DataTemplateSelector and CustomDataTemplateSelector
- All about Splash Screens in WP7 – Creating animated Splash Screen
- Getting Started with Unit Testing in Silverlight for WP7
- WP7 WatermarkedTextBox custom control
Our Top Tips & Samples
- All about WP7 Isolated Storage series
- WP7 Dynamically Generating DataTemplate in code
- 5 tips for a successful WP7 Marketplace submission
- WP7: Navigating to a page in different assembly
- WP7 ContextMenu: answers to popular questions
- WP7 ListBox: answers to popular questions
- WP7 working with Images: Content vs Resource build action
- WP7 Element Binding samples
- WP7 working with XML: reading, filtering and databinding
- Drawing in WP7: #2 Drawing shapes with finger
- WP7 TextBox Light theme problems - the solution
- Changing the WP7 Panorama Background Image dynamically with Animation
