问题1) Virtual block: 51d70000 - 51d70000 (size 00000000)用来描述一个大虚拟内存块(参见《软件调试》P655),其中显示的size 0是因为缺少数据结构_HEAP_VIRTUAL_ALLOC_ENTRY的符号,所以没能取到正确的信息。
问题2)!address显示的是整个用户态的地址空间,2GB,堆只是这个地址空间中的一部分,此外还有模块映像、PEB、栈等,所以根据!heap -s统计出来的数据是应该比!address显示的总内存小啊。
问题3)页堆使用独特的管理结构,所以应该使用!heap -p来观察。
RegionUsageHeap代表普通堆(不包括页堆)所使用的内存,比如在没有启用页堆情况下调用new(不包括重载情况),malloc,或者HeapAlloc而分配的内存属于此类。
RegionUsageImage代表映像文件所使用的内存,比如加载了的EXE或者DLL模块。
RegionUsageIsVAD的含义有些模糊,WinDBG帮助文件是这样说明的:
The "busy" region. This region includes all virtual allocation blocks, the SBH heap, memory from custom allocators, and all other regions of the address space that fall into no other classification.
在上面的解释中,需要注意的是,这里的virtual allocation blocks不是指使用HeapAlloc分配超大堆块时堆管理器分配的大虚拟内存块,而是指程序直接调用VirtualAlloc API而分配的内存。
通过HeapAlloc间接分的大虚拟内存块是被算作RegionUsageHeap的。
观察你贴出的数据,RegionUsageIsVAD 显然偏高,占了超过1G的内存,因此估计你的程序(你的代码或者使用的第三方模块)中直接调用了VirtualAlloc API。所以建议你按这个线索查一下。