2011-03-10 64 views
2

首先,我的英語不好。 非常抱歉。我不是英文生活區。從windbg堆輸出垃圾摘要

我有一個問題。

我正在使用Windows服務器程序的內存碎片。 因爲內存不足,不能運行一週以上。 可能是問題所在。

所以,我以前用windbg堆內存分析到'.heap -s地址(堆句柄)命令。 但我不明白這份報告。看它。

 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

如果您懷疑內存泄漏,那麼使用的一個好工具是UMDH。這是一個免費的工具,MSDN上有很好的文檔。這將允許您獲得allocs/deallocs上的調用堆棧,並確切瞭解哪些調用堆棧正在泄漏,只要您有完整的符號。

+0

+1,必須使用正確的工具。否則,你只是困惑自己。 – 2011-03-13 05:41:38

0

爲了獲得關於內存碎片問題的分析,我通常使用DebugDiag。正式版本爲1.1,但如果您使用Windows 7或Windows Server 2008,則需要版本1.2測試版,該版本可在http://viisual.net/Tools/source)上獲取。

最近,我發現我可以使用Windbg的「!address」命令給我一個完整的進程地址空間轉儲。通過將它放入Excel電子表格中,將所有十六進制值轉換爲二進制值並執行一些最大/求和函數,我可以快速找出可用的最大連續塊與未分配多少空間的比較,這很好地表明瞭很多碎片是。我沒有試過這個,但是用這個存儲器映射武裝,理論上你可以找出壞的碎片並檢查存儲器內容。

這些建議中的任何一個都不會告訴你碎片是如何發生的。我肯定會嘗試下一次nithins建議的UMDH工具。