mar*_*dle 6 memory memory-leaks memory-management windbg
我在尝试从 .dmp 文件中找到一些非托管内存分配时遇到了一些麻烦。
我一直在尝试遵循提示 -在这里,但我遇到了一些障碍
!address -summary给了我下面的内容,它显示 MEM_COMMIT 为 1.030Gb,这是预期的(请忽略 TB 内存,这可能是因为它来自虚拟 Web 服务器)

!eeheap -gc给了我下面的内容,它显示 .net 内存使用量为 150MB(如果我自己运行!eeheap,我看不到任何额外的堆,我仍然看到 8 个 GC 堆,总共 150MB)

这让我相信大部分内存使用来自非托管内存
我一直遵循的说明然后说使用!heap -s来查找非托管内存的位置。当我这样做时,我会看到以下内容

现在我希望看到大量内存被堆使用,我可以进一步分析以尝试定位非托管内存,但我没有看到任何接近填充的堆显示 1GB 的已用内存
我确实注意到!address -summary在 PAGE_READWRITE 中显示 600MB,所以我尝试了!address /f:PAGE_READWRITE ,我希望它能给我一些其他的东西,但它给了我一个 PAGE_READWRITE 使用的内存列表,我不太确定如何进一步分析
基本上我想知道 1GB 和 150MB 的 .net 分配内存之间的内存差异在哪里被使用
任何帮助都会很棒
在“使用总结”中可以看到
<unknown> 17 GB
Heap 235 MB
Run Code Online (Sandbox Code Playgroud)
<unknown>可以是.NET或者.NET直接分配的内存VirtualAlloc()。恕我直言,直接使用的人VirtualAlloc()很少见。
Heap是通过堆管理器分配的内存。因此,!heap -s不会显示超过 235 MB。
MEM_COMMIT只是内存的另一种状态,它可以处于任何使用状态。要找到 1 GB 的已提交内存,您需要总结您拥有的所有内容:
154 MB used by .NET GC Heaps
235 MB used by Heaps
234 MB used by Images
up to 50 MB in Stacks
... some smaller parts not really relevant
Run Code Online (Sandbox Code Playgroud)
这已经解释了 620 到 670 MB 的内存,具体取决于实际提交的堆栈内存量。
!eeheap如果不带参数执行-gc,您将看到 .NET 使用了更多内存,因为它还有 LoaderHeap、JIT 堆、域堆等。