My w3wp's are recycling every 60 seconds after using too much virtual memory.
I ran the IIS Debug Diagnostic Tool to capture a memory dump before the worker process recycled; the most interesting part seems to be this:
Virtual Allocation Summary
Reserved memory 4.88 GBytes
Committed memory 328.27 MBytes
Mapped memory 17.36 MBytes
Reserved block count 524 blocks
Committed block count 1082 blocks
Mapped block count 43 blocks
So that 4.88 GBytes of reserved memory seems really big. But neither the DotNetMemoryAnalysis or the regular Memory Pressure Analyzer seems to tell me where that 4.88 GB went.
How can I find out?
Virtual memory is not a scarce resource. The operating system can create huge amounts of it at nearly zero cost. So there's no reason to be concerned about virtual memory consumption. You can just ignore it. David Wang addresses this specific issue in great detail in a blog post if you want the nitty gritty.
Whatever is recycling based on virtual memory consumption needs to be changed not to do that, since that makes no sense. If you memory map a 4GB file, you'll use 4GB of virtual memory, even though the real system resources needed to do that are trivial. (And it won't show as mapped memory because "mapped memory" only counts pages that have faulted in.)
Process recycling based on virtual memory is utterly useless.