我有一个内存转储。在这个转储中,我有一个句柄fd00000
的堆。这是!heap -s fd00000
命令输出的摘录:
0: Heap 0fd00000
Flags 00001002 - HEAP_GROWABLE
Reserved memory in segments 80192 (k)
Commited memory in segments 56540 (k)
Virtual bytes (correction for large UCR) 60592 (k)
Free space 3884 (k) (572 blocks)
External fragmentation 6% (572 free blocks)
Virtual address fragmentation 6% (69 uncommited ranges)
Virtual blocks 124 - total 0 KBytes
Lock contention 23
Segments 1
您会看到它按预期显示摘要信息。但!heap -stat -h 0fd00000
的ouptut
显示以下内容:
heap @ 0fd00000
group-by: TOTSIZE max-display: 20
size #blocks total ( %) (percent of total busy bytes)
19fa40 7a - c614280 (93.96)
62d30 4 - 18b4c0 (0.73)
d49 13d - 107365 (0.49)
它都是十六进制的,所以从这里我看到"总忙字节"超过205 MBytes。 所以你看到!heap -s
告诉我这个堆有80 MB / 60 MB的保留/虚拟内存,而!heap -stat
告诉我这个堆占用205 MBytes。这个缺陷是如此巨大。这怎么可能?当我运行!heap -s
时,我会看到多个这样的条目:
Virtual block: 293c0000 - 293c0000 (size 00000000)
也许这就是原因?
答案 0 :(得分:1)
当大型分配流经堆管理器时,已知某些!heap
个开关的行为不正确。堆管理器会将大量分配直接转发到VirtualAlloc
,而某些!heap
命令知道如何跟踪这些分配,而其他命令则不知道。您还应该尝试将WinDbg版本更新到最新的Windows SDK,因为!heap
命令与堆管理器的内部数据结构密切相关,后者随Windows版本而变化。
我建议在这种情况下使用VMMap来检测大型分配源。