从windbg堆摘要输出垃圾

时间:2011-03-10 01:02:53

标签: c++ memory-management windbg memory-fragmentation

首先,我的英语不好。 非常抱歉。我不是英语区。

我有一个问题。

我正在处理Windows服务器程序的内存碎片。 因为内存不足不能运行一周以上。 可能是问题。

所以,我曾经把windbg的内存分析堆到'.heap -s address(堆句柄)命令。 但我不明白这个报道。看看它。

       0:023> !heap -s 0x01490000
       Walking the heap 0000000001490000 ...........
       0: Heap 0000000001490000

       -- Omitted --

       Flags          00001002 - HEAP_GROWABLE 
       Reserved memory in segments              1047616 (k)
       Commited memory in segments              617812 (k)
       Virtual bytes (correction for large UCR) 188152 (k)
       Free space                               549 (k) (25 blocks)
       External fragmentation          0% (25 free blocks)
       Virtual address fragmentation   1254577998% (3 uncommited ranges)
       Virtual blocks  32 - total 0 KBytes
       Lock contention 1
       Segments        11

虚拟地址碎片具有垃圾值。 有什么问题??这是正确的价值吗?

我有计划。试图验证性能改进。另外,确定是否存在问题。但不可能,因为这个问题。

我试过搜索很多种文章。但我无法获得有用的信息。

请帮帮我。

首先,为什么会这样?

第二,是否有办法更有效地使用记忆?

可能是,你看了我的帖子很难。我知道。真的很抱歉。

感谢您阅读我的帖子。

3 个答案:

答案 0 :(得分:3)

如果您怀疑内存泄漏,那么使用的一个很棒的工具是UMDH。这是一个免费的工具,在MSDN上有很好的文档。这将允许您获取allocs / deallocs上的callstack并确切地看到哪些调用堆栈正在泄漏,只要您有完整的符号。

答案 1 :(得分:1)

Windbg堆命令有时会出错,尤其是在跟踪大量泄漏时。 要检查内存碎片,最好使用Vmmap http://technet.microsoft.com/en-us/sysinternals/dd535533

您将从Vmmap报告中找出可疑的内存位置。 然后使用Windbg查看这些分配的内容。

答案 2 :(得分:0)

要分析内存碎片问题,我通常使用DebugDiag。官方版本为1.1,但如果您使用的是Windows 7或Windows Server 2008,则需要版本1.2 beta,可在http://viisual.net/Tools/source)获得。

最近,我发现我可以使用Windbg的“!address”命令给我一个完整的进程地址空间转储。通过将其放入Excel电子表格,将所有十六进制值转换为二进制并执行一些max / sum函数,我可以快速找出可用的最大连续块数与未分配空间量之间的差异,这是一个很好的指示碎片很多。我没有试过这个但是配备了内存映射,理论上,你可以找出坏的碎片并检查内存内容。

这些建议中的任何一个都不会告诉您碎片是如何发生的。我肯定会尝试下次nithins建议的UMDH工具。