And No I don’t have a solution for it and probably the only workaround is to make your visual studio Large Address Aware(3GB switch) on x86.

Steps to re-create
1. download and unzip http://debuggingblog.com/resources/transcripts.zip
2. open, close the xml file and try to load it the second time
3. If you load the xml file using IE8, you will see the followings once you close it
——————– State SUMMARY ————————–
TotSize ( KB) Pct(Tots) Usage
19e6f000 ( 424380) : 20.24% : MEM_COMMIT
f3b4000 ( 249552) : 11.90% : MEM_FREE
56dcd000 ( 1423156) : 67.86% : MEM_RESERVE
Almost 1.4 GB Memory allocated in GC Segements for xml file is still reserved even after unloading the xml file.
However, visual studio 2008 is another story
0:000> !eeheap -gc
ephemeral segment allocation context: none
segment begin allocated size
01830000 01831000 027ecadc 0x00fbbadc(16497372)
12860000 12861000 137616c4 0x00f006c4(15730372)
………………………………………………………………………………..
We have bunch of 16MB GC segments and most of the objects are in gen 2.
0c55d1ec 739459 85777244 Microsoft.XmlEditor.XmlElement
0c559858 1496448 89786880 Microsoft.XmlEditor.Identifier
001f1918 105303 97472784 Free
793308ec 2369315 387475460 System.String
Total 9375571 objects
we have 90+ MB of free blocks and 380+MB in System.String. There are 2.36 million string objects, yeah so you don’t wanna pick each one of the string object to find GC root unless Microsoft or someone is paying you a dime to dump each object and aha a dump a day will make your day for sure.
0:000> !dumpheap -mt 0c9d4134
Address MT Size
018f241c 0c9d4134 68
5f610108 0c9d4134 68
total 2 objects
Statistics:
MT Count TotalSize Class Name
0c9d4134 2 136 Microsoft.XmlEditor.XmlDocumentProperties
Total 2 objects
0:000> !objsize 018f241c
sizeof(018f241c) = 507372388 ( 0x1e3de364) bytes (Microsoft.XmlEditor.XmlDocumentProperties)
0:000> !objsize 5f610108
sizeof(5f610108) = 507371128 ( 0x1e3dde78) bytes (Microsoft.XmlEditor.XmlDocumentProperties)
Did you just see that almost 1GB of virtual memory rooted in Microsoft.XmlEditor.XmlDocumentProperties? That’s just outrageous, I mean why would microsoft visual studio take up 1.2 GB of virtual memory to open a 58MB file, although It does make use of schema context cache.
0:000> !gcroot -nostacks 018f241c
DOMAIN(001EC570):HANDLE(RefCnt):16d1b20:Root:018f241c(Microsoft.XmlEditor.XmlDocumentProperties)
GCHandle of type RefCnt is keeping reference to Microsoft.XmlEditor.XmlDocumentProperties
There is an OutOfMemoryException thrown with the following callstack
Exception object: 5ed00a34
Exception type: System.OutOfMemoryException
Message: Insufficient memory to continue the execution of the program.
InnerException: <none>
StackTrace (generated):
SP IP Function
0012F5A0 0C97E8B3 Microsoft_VisualStudio_Package_LanguageService_9_0!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure(Int32, Int32[])+0x3b
0012F5AC 0C9E94BB Microsoft_VisualStudio_Package_LanguageService_9_0!Microsoft.VisualStudio.Package.Source.GetText()+0x3c
0012F5DC 0C9E9360 Microsoft_VisualStudio_Package_LanguageService_9_0!Microsoft.VisualStudio.Package.Source.BeginParse()+0×55
0012F644 0C9ECF38 Microsoft_VisualStudio_Package_LanguageService_9_0!Microsoft.VisualStudio.Package.Source.OnIdle(Boolean)+0×80
0012F654 0C9ECE28 Microsoft_VisualStudio_Package_LanguageService_9_0!Microsoft.VisualStudio.Package.LanguageService.OnIdle(Boolean)+0xd8
0012F674 0C9ECCDD Microsoft_XmlEditor!Microsoft.XmlEditor.XmlLanguageService.OnIdle(Boolean)+0×35
0012F684 0C9ECC34 Microsoft_XmlEditor!Microsoft.XmlEditor.Package.FDoIdle(UInt32)+0xc4
Conclusion
I hope this is fixed in Visual Studio 2010, I do need to try it out.
