memory - WinDbg MEM_COMMIT 为 1GB,eeheap 显示为 150MB,找不到剩余内存

标签 memory memory-management memory-leaks windbg

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

我一直在尝试遵循提示 - here但我有点撞墙

!address -summary 给我下面的内容,显示 MEM_COMMIT 为 1.030Gb,这是预期的(请忽略 TB 内存,这可能是因为它来自虚拟 Web 服务器)

Address Summary

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

eeheap

这让我相信大部分内存使用来自非托管内存

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

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/

相关文章:

perl - 从子堆栈中删除 Perl 模块

objective-c - 如何为对象指针指针(id *)选择 ARC 桥接说明符?

c++ - 'Resource Acquisition Is Initialization'解决内存泄漏问题

iPhone SDK : I have memory issues, 任何人都可以帮助新手修复它们吗?

haskell - 使用scanl时空间泄漏在哪里? ( haskell )

swift - 在 swift 中切换 View Controller 时内存使用量增加

Python deepcopy 使用的内存比需要的多

安卓内存泄漏

c - 将一个int值插入到一个char类型的指针中

ios - 如何停止类(class)计时器? - swift