【发布时间】:2012-07-03 07:53:32
【问题描述】:
例如,如果我发现其中一些堆非常大,我的下一个问题是谁(本机代码或托管代码)使用它们。 如何确定 CLR 用于其目的的本机堆 (!heap -s)?
【问题讨论】:
标签: memory garbage-collection clr heap-memory windbg
例如,如果我发现其中一些堆非常大,我的下一个问题是谁(本机代码或托管代码)使用它们。 如何确定 CLR 用于其目的的本机堆 (!heap -s)?
【问题讨论】:
标签: memory garbage-collection clr heap-memory windbg
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)
【讨论】:
CLR 使用 VirtualAlloc 分配内存段以用作托管堆。您可以使用 !sos.eeheap -gc 检查这些段。 !sos.dumpheap -stat 将显示托管堆正在使用多少内存,以及哪些类型的对象正在消耗内存。
【讨论】: