Where's your leak at? [Using WinDbg, SOS, and GCRoot to diagnose a .NET memory leak]
**
This blog has moved to a new location and comments have been disabled.
All old posts, new posts, and comments can be found on The blog of dlaa.me.
See you there!
Comments
Anonymous
March 11, 2009
PingBack from http://blogs.msdn.com/delay/archive/2009/03/11/where-s-your-leak-at-using-windbg-sos-and-gcroot-to-diagnose-a-net-memory-leak.aspxAnonymous
March 12, 2009
.NET NP .NET Profiler – a tool is designed to assist in troubleshooting issues such as slow performanceAnonymous
March 12, 2009
.NETNP.NETProfiler–atoolisdesignedtoassistintroubleshootingissuessuchasslowperf...Anonymous
March 13, 2009
Thank you for submitting this cool story - Trackback from DotNetShoutoutAnonymous
March 21, 2009
It's been a while since the last post was online. We have been very busy in working on one of the veryAnonymous
July 27, 2010
One thing i have observed in this application is that when we do a refresh using the F5 .the memory is not releasing rather i will add some more MB .Is this is releasing the memory correctly i doubtAnonymous
July 28, 2010
Sunil, It's possible there's some kind of a leak in the version of Silverlight you're using. But because I was mainly concerned with helping people understand how to detect (and fix) leaks in their own controls, I didn't pay much attention to other things that were going on at the same time. :)Anonymous
July 28, 2010
Ok i understood your intention about this post . But i seriously doubt that the memory management in silverlight version 3 and 4 is not working properly.if you could post some thing that really reduce the leak at least to some 90 % as this would provide a breather/relief not only for the memory but also the developers.:)Anonymous
August 02, 2010
I see that my MapTipDialog is leaking but I can't understand the dump. Could you tell me who is keeping my object? DOMAIN(0378BE38):HANDLE(Pinned):34f12f8:Root: 05664260(System.Object[])-> 046789d0(System.Collections.Generic.Dictionary2[[System.IntPtr, mscorlib],[System.Object, mscorlib]])-> 058b7000(System.Collections.Generic.Dictionary
2+Entry[[System.IntPtr, mscorlib],[System.Object, mscorlib]][])-> 0f469a9c(System.Windows.Controls.ControlTemplate)-> 0f46995c(System.Windows.ResourceDictionary)-> 0f469b50(MS.Internal.ResourceDictionaryCollection)-> 0f469bb4(System.Windows.ResourceDictionary)-> 0f46a1bc(System.Windows.Controls.StackPanel)-> 0f46f8ac(System.Windows.Controls.ContentPresenter)-> 0f46f920(System.Windows.Controls.Border)-> 0f46f134(System.Windows.Controls.Grid)-> 0f46f230(System.Windows.Controls.Border)-> 0f46e9f8(System.Windows.Controls.Canvas)-> 0f469360(View.Dialogs.ToolTips.MapTipDialog)Anonymous
August 02, 2010
Sergio, Not offhand, no. :( I'd start by looking at those top three instances to try to figure out what collections are involved and why the control is in them. It's also possible this is due to a platform bug - in which case it might be fixed by a future release of Silverlight.Anonymous
August 02, 2010
Now I'm starting to guess that it's a bug too because I've removed all content from my control and all interactions but it's still kept by ControlTemplate. DOMAIN(0342BE38):HANDLE(Pinned):37012f8:Root: 05664260(System.Object[])-> 046789d0(System.Collections.Generic.Dictionary2[[System.IntPtr, mscorlib],[System.Object, mscorlib]])-> 057a55e8(System.Collections.Generic.Dictionary
2+Entry[[System.IntPtr, mscorlib],[System.Object, mscorlib]][])-> 0f1d8130(System.Windows.Controls.ControlTemplate)-> 0f1d79d4(View.Dialogs.ToolTips.MapTipDialog) Firstly I thought that it is because of binding in my ControlTemplate. I temporary removed it but in vain - the memory is not collected anyway.Anonymous
August 03, 2010
Sergio, The following thread on the Silverlight forums might help - there's a lot going on in there, but it discusses a couple of potential leak scenarios that may be relevant: forums.silverlight.net/.../171739.aspx Hope this helps!Anonymous
August 06, 2010
Thanks for reply! Finally I decided to reuse all leaking controls rather than create new instances in order not to spend time for exploring each case of leaking.Anonymous
August 07, 2010
Sergio, That sounds like a great solution!Anonymous
September 22, 2011
What does it mean when !gcroot <address> returns 'Found 0 unique roots (run !GCRoot -all to see all roots)'? When I run GCRoot -all <address> it sits there forever (well, more than 20 minutes, I haven't let it go on forever.)Anonymous
September 22, 2011
Marc, It sounds like the specific object instance you're passing to GCRoot is not actually rooted. In other words, it's garbage and will be removed during the next collection. PS - Running GCRoot on a large application with many objects in memory can sometimes take a long while to complete; I suspect that's the source of the delay you're seeing with "-all".