in Programming

Useful, free tools for .Net app memory profiling

In the process of trying to slim down ChartPT‘s memory usage, I settled on these free tools:

VMMaphttp://technet.microsoft.com/en-us/sysinternals/dd535533.aspx

Skip the many tutorials out there for the command line “vadump.exe” and use VMMap instead. The GUI presents information in a much more useful format (filterable, sortable).

First, check the list of loaded modules – some are explicit References in your project, others are dependencies of your references – and eliminate dependencies that you can do without.  Next, check the “Private” and “Private Working Set” columns to identify areas that you may have some control over.

CLR 2.0 Profiler – http://www.microsoft.com/downloads/details.aspx?familyid=a362781c-3870-43be-8926-862b40aa0cd0&displaylang=en

Be sure to grab the “2.0” flavor of the profiler.  Many tutorials are old and link to the CLR 1 version of the .Net Profiler – that version won’t work with your app that builds against .Net 2.0 or newer.

Use this app to take a snapshot of your memory usage, then view allocations by object type and view allocations in a call graph.

Tutorial: http://msdn.microsoft.com/en-us/library/ff650691.aspx

My biggest culprit: WCF

System.ServiceModel and System.Web grab 5.5MB of private memory (14+MB of private WS on my machine) as soon as I instantiate a client proxy object.  The same things happens using built-in HTTP bindings in a skeleton console app or in the WCF test client.  The System.Web allocation could probably be eliminated by changing to TcpTransport.