See the question and my original answer on StackOverflow

You can find some very good tutorials on how to debug the most common types of hang, performance, memory and crash scenarios with .NET and ASP.NET here: .NET Debugging Demos - Information and setup instructions. These series are really worth reading, as it's full of information, but it takes quite a time :-)

One common problem for server-side apps is to allocate tons of "big" .NET objects that hit the Large Object Heap. Check out if you do a lot of byte[] or MemoryStream allocations bigger than 85Kb (objects with a contiguous size higher than this will go in the LOH and this heap cannot be compacted) for example. This tipically happens if you do a lot of big file (PDF, images, etc.) generation, copying, etc... This should be done using pure streaming without full size allocations.