我在尝试从 .dmp 文件中找到一些非托管内存分配时遇到了一些麻烦。
我一直在尝试遵循提示 - here但我有点撞墙
!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
<unknown>
可以是 .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
这已经解释了 620 到 670 MB 的内存,具体取决于实际提交的堆栈内存量。
如果执行
!eeheap
没有 -gc
参数,您会看到 .NET 使用了更多内存,因为它还有 LoaderHeaps、JIT Heaps、域堆等。
关于memory - WinDbg MEM_COMMIT 为 1GB,eeheap 显示为 150MB,找不到剩余内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30862007/