首先,我的英语不好。非常抱歉。我不是住在英语区。
我有个问题。
我正在处理Windows服务器程序的内存碎片。由于内存不足,不能运行超过一周。这可能是个问题。
因此,我习惯于使用windbg to '.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虚拟地址碎片具有无用价值。有什么问题吗??它的价值是正确的吗?
我已经计划好了。已尝试验证性能改进。另外,确定是否存在问题。但不可能,因为这个问题。
我试着搜索了很多种类的文章。但我无法获得有用的信息。
请帮帮我。
首先,为什么会发生这种情况?
第二,是更有效地使用内存的方法吗?
也许,你读我的帖子很难。我知道呀。真的真的很抱歉。
感谢您阅读我的帖子。
发布于 2011-03-10 12:25:09
如果您怀疑是内存泄漏,那么UMDH将是一个很好的工具。这是一个免费的工具,在MSDN上有很好的文档。如果你有完整的符号,这将允许你在allocs/deallocs上获取调用堆栈,并准确地看到调用堆栈泄漏了什么。
发布于 2011-04-05 18:37:18
Windbg堆命令有时会出现错误,特别是在跟踪大量泄漏时。要检查内存碎片,最好使用Vmmap http://technet.microsoft.com/en-us/sysinternals/dd535533
您将从Vmmap报告中找出可疑的内存位置。然后使用Windbg查看这些分配的内容。
发布于 2011-03-18 07:40:31
为了分析内存碎片问题,我通常使用DebugDiag。官方版本是1.1,但如果你使用Windows7或Windows Server2008,你将需要1.2beta版本,该版本可从http://viisual.net/Tools/ (source)获得。
最近,我发现可以使用Windbg的"! address“命令完全转储进程的地址空间。通过将其放入Excel电子表格中,将所有十六进制值转换为二进制,并执行一些max/sum函数,我可以快速找出最大的连续块有多少可用,以及有多少空间未分配,这很好地表明了碎片有多大。我还没有尝试过,但是有了那个内存映射,理论上,你可以找出坏的片段并检查内存内容。
这两个建议都不会告诉您碎片是如何发生的。下一次我一定会尝试一下nithins建议的UMDH工具。
https://stackoverflow.com/questions/5254299
复制相似问题