CLR GC堆是如何映射到本地堆的?

时间:2012-07-02 21:31:53

标签: memory garbage-collection clr heap windbg

例如,如果我发现其中一些堆很大,我的下一个问题是谁(本机代码或托管代码)使用它们。 我怎样才能找出CLR用于其目的的本地堆(!heap -s)?

2 个答案:

答案 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)