2

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

我有个问题。

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

所以,我曾经通过windbg对'.heap -s address(heap handle)命令进行堆内存分析。但我不明白这份报告。看它。

       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

虚拟地址碎片具有垃圾值。有什么问题??值对吗??

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

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

请帮我。

首先,为什么会发生?

其次,是更有效地使用内存的方法吗?

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

感谢您阅读我的帖子。

4

3 回答 3

3

如果您怀疑内存泄漏,那么UMDH就是一个很好的工具。这是一个免费工具,MSDN 上有很好的文档。如果您有完整的符号,这将允许您获取 allocs/deallocs 上的调用堆栈并准确查看正在泄漏的调用堆栈。

于 2011-03-10T04:25:09.333 回答
1

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

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

于 2011-04-05T10:37:17.807 回答
0

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

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

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

于 2011-03-17T23:40:31.040 回答