首先,我的英语不好。 非常抱歉。我不是英语区。
我有一个问题。
我正在处理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
虚拟地址碎片具有垃圾值。 有什么问题??这是正确的价值吗?
我有计划。试图验证性能改进。另外,确定是否存在问题。但不可能,因为这个问题。
我试过搜索很多种文章。但我无法获得有用的信息。
请帮帮我。
首先,为什么会这样?
第二,是否有办法更有效地使用记忆?
可能是,你看了我的帖子很难。我知道。真的很抱歉。感谢您阅读我的帖子。
答案 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工具。