【问题标题】:WinDbg MEM_COMMIT is at 1GB, eeheap is showing 150MB, can't find remaining memoryWinDbg MEM_COMMIT 为 1GB,eeheap 显示 150MB,找不到剩余内存
【发布时间】:2023-03-18 15:16:01
【问题描述】:

我在尝试从 .dmp 文件中查找一些非托管内存分配时遇到了一些麻烦。

我一直在尝试遵循提示 - here,但我遇到了一些问题

!address -summary 给了我下面的信息,显示 MEM_COMMIT 为 1.030Gb,这是预期的(请忽略 TB 的内存,这可能是由于事实上这是来自虚拟网络服务器)

!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 分配内存之间的内存差异在哪里使用

任何帮助都会很棒

【问题讨论】:

  • 免费 TB 是 64 位应用程序的结果。您可以获得该数量的虚拟内存,但它可能会被交换到磁盘。
  • 在DebugDiag分析器(MemoryAnalysis)中加载dmp
  • @magicandre1981 - 我还没有设法让 DebugDiag 向我提供有关非托管内存的任何信息
  • 我从 DebugDiag 获得的唯一信息似乎来自托管内存,它报告的总内存为 150mb

标签: memory memory-management memory-leaks windbg


【解决方案1】:

在“使用总结”中可以看到

<unknown>  17 GB
Heap       235 MB

&lt;unknown&gt;可以是.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 的内存,具体取决于实际提交的堆栈内存量。

如果你在没有-gc 参数的情况下执行!eeheap,你会看到.NET 使用的内存更多,因为它还有LoaderHeaps、JIT Heaps、域堆等。

【讨论】:

  • 谢谢,你能帮我澄清一下“图像”吗?是 .dll 的还是实际的图像?
  • @martpendle:图像是 DLL、EXE 和类似的术语。它们被加载到内存中以执行其中的代码,因此可能会 100% 提交内存。
  • 谢谢,有没有我可以看到加载了哪些以及它们占用了多少内存?
  • 毫无疑问 Windbg 可以做到,但 Sysinternals 的 VMMap 会证明这一点,而且更容易退出。
  • lm 列出所有图像。您可以根据输出计算大小。 !lmi &lt;name&gt; 还包括大小。不要太担心图像 - 通常没有太多需要优化的地方。
猜你喜欢
  • 2014-06-16
  • 1970-01-01
  • 2018-10-16
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多