例如,如果我发现其中一些堆很大,我的下一个问题是谁(本机代码或托管代码)使用它们。 我怎样才能找出CLR用于其目的的本地堆(!heap -s)?
答案 0 :(得分:1)
CLR使用VirtualAlloc分配内存段以用作托管堆。您可以使用!sos.eeheap -gc检查细分。 !sos.dumpheap -stat将显示托管堆正在使用多少内存,以及哪些类型的对象占用内存。
答案 1 :(得分:0)
CLR不使用任何本地堆。 使用SOS和!DumpHeap查看托管堆。
以下link用于查找使用原生堆的人。
我使用DebugDiag 1.1获得了一些好的结果,用于查找谁在使用哪个本机堆。
编辑: 虽然 VirtualAlloc 用于为本机堆分配内存,但!CLRUsage显示还使用了本机堆。但是我不知道目的。
0:000> !CLRUsage
Native Heap for mscorwks: 0x07e60000
Number of GC Heaps: 1
------------------------------
GC Heap Size 0xbc7dd4(12,352,980)
Total Commit Size 00e22000 (14 MB)
Total Reserved Size 0225e000 (34 MB)
Initial reservation type: All at once
Initial Allocation Size: 2000000 (33,554,432) (32 MB)
Reserved Memory Size: 3000000 (50,331,648) (48 MB)
Reserved Memory Limit Size: 3000000 (50,331,648) (48 MB)