.NET Memory Profiling Tools [duplicate]
Solution 1:
I'm currently evaluating both the Scitech .NET Memory Profiler 3.1 and ANTS Memory Profiler 5.1. I tried the JetBrains one a year or two ago and it wasn't as good as ANTS so I haven't bothered this time. From reading the web sites it looks like it isn't as good for memory profiling as the other two.
Both ANTS and the Scitech memory profiler have features that the other doesn't, so which is best will depend upon your preferences. Generally speaking, the Scitech one provides more detailed information while the ANTS one is really incredible at identifying the leaking object. Overall, I prefer the ANTS one because it is so quick at identifying possible leaks.
Here are the main the pros and cons of each from my experience:
Common Features of ANTS and Scitech .NET Memory Profiler
- Real-time analysis feature
- Excellent how-to videos on their web sites
- Easy to use
- Reasonably performant (obviously slower than without the profiler attached, but not so much you become frustrated)
- Show instances of leaking objects
- Basically they both do the job pretty well
ANTS
- One-click filters to find common leaks including: objects kept alive only by event handlers, objects that are disposed but still live and objects that are only being kept alive by a reference from a disposed object. This is probably the killer feature of ANTS - finding leaks is incredibly fast because of this. In my experience, the majority of leaks are caused by event handlers not being unhooked and ANTS just takes you straight to these objects. Awesome.
- Object retention graph. While the same info is available in Scitech, it's much easier to interpret in ANTS.
- Shows size with children in addition to size of the object itself (but only when an instance is selected unfortunately, not in the overall class list).
- Better integration to Visual Studio (right-click on graph to jump to file)
Scitech .NET Memory Profiler
- Shows stack trace when object was allocated. This is really useful for objects that are allocated in lots of different places. With ANTS it is difficult to determine exactly where the leaked object was created.
- Shows count of disposable objects that were not disposed. While not indicative of a leak, it does identify opportunities to fix this problem and improve your application performance as a result of faster garbage collection.
- More detailed filtering options (several columns can be filtered independently).
- Presents info on total objects created (including those garbage collected). ANTS only shows 'live' object stats. This makes it easier to analyze and tune overall application performance (eg. identify where lots of objects being created unnecessarily that aren't necessarily leaking).
By way of summary, I think ANTS helps you find what's leaking faster while Scitech provides a bit more detail about your overall application memory performance and individual objects once you know what to look at (eg. stack trace on creation). If the stack trace and tracking of undisposed disposable objects was added to ANTS I wouldn't see the need to use anything else.
Solution 2:
Strange that CLR Profiler isn't mentioned here yet. It's free and works well.
Beware of the multiple old versions available from Microsoft's own site. As of Nov 2011, the latest version appears to be this one: latest version (alternate link)
Solution 3:
If you're feeling really desperate, you can use WinDbg with the Son-of-Strike library (SOS.DLL) that ships with the .Net framework.