I am using VMMap to analyse Virtual/Process Address Space utilisation in my mixed mode (managed and unmanaged) application. I understand how the Windows VMM and the Virtual Memo
I know it's a pretty old question. But it's still unanswered for some reason. This question was mentioned by Sasha Goldstein in his talk about WinDbg at DotNext conference - https://www.youtube.com/watch?v=8t1aTbnZ2CE. The point was it can be easily answered with help of WinDbg.
To answer whether CLR uses VirtualAlloc for its heap we'll set a breakpoint at this function with a script which prints current stack (native and managed).
bp kernelbase!VirtualAlloc ".printf \"allocating %d bytes of virtual memory\", dwo(@esp+8);.echo; k 5; !clrstack; gc"
Here: k 5
print last 5 frames of native callstack and !clrstack
(from SOS) prints managed stack. gc
continue execution.
Please note that this script will work only for x86 processes. For x64 you'll need some other (registries and calling convention differ).
Then I created a simple program which allocate an object and adds it to a List.
static void Main(string[] args)
{
var list = new List<string[]>();
while (true) {
var a = Console.ReadLine();
if (a == "q" || a == "Q") break;
var arr = new string[100];
list.Add(arr);
}
}
Run it under WinDbg and started pressing Enter. At some point the breakpoint hit - on List expanding and allocating additional memory in the heap:
So obviously CLR uses VirtualAlloc for allocating memory for its heap.