2010-10-31 33 views
1

我有一個圖形程序,我一次又一次地創建和銷燬相同的對象。總而言之,有140個物體。它們會被刪除並更新,因此數字永遠不會增加140.這是一個要求,因爲它是一個壓力測試,也就是說我不能擁有內存池或虛擬對象。現在我相當確定沒有任何內存泄漏。我也在使用內存泄漏檢測器,它不報告任何泄漏。增加內存佔用。錯誤報警或內存泄漏?

的問題是,該程序的內存佔用持續增加(儘管很慢,比在其中對象被摧毀/創建的速率更慢)。因此,我的問題是,增加的內存佔用是否是內存泄漏的可靠跡象,或者它有時可能是欺騙?

編輯:我使用新/刪除創建/銷燬的對象

+2

什麼語言?什麼平臺?你怎麼確定沒有內存泄漏?你是如何創造這些物體的?你如何摧毀它們? – jcolebrand 2010-10-31 19:41:44

+0

我道歉,我編輯了更多的標籤。我創建和銷燬使用新/刪除,因此在堆 – Samaursa 2010-10-31 21:26:31

回答

3

這種行爲似乎可能來自沒有泄漏的情況。

是否有任何機會,你的堆越來越fragmented

說你賺很多大小n的分配。你將它們全部釋放,這使得你的C庫將這些緩衝區插入到一個空閒列表中。其他一些代碼路徑會使分配小於n,因此空閒列表中的塊將被分塊爲更小的單元。然後循環的下一次迭代會執行另一批大小爲n的分配,並且空閒列表不再包含該大小的連續內存,並且malloc必須向內核請求更多內存。最終,這些「小於n」的分配將會像您的「大小」一樣被釋放,但是如果您在存在碎片的地方運行足夠多的迭代,我可以看到該進程逐漸增加其內存佔用量。

避免這種情況的一種方法可能是分配所有對象一次,而不是分配/釋放它們。既然你使用C++,這可能需要placement new或類似的東西。既然你使用的是Windows,我可能還會提到Win32在一個進程中支持having multiple heaps,所以如果你的對象來自不同於其他分配的堆,你可以避免這種情況。包括在CRT

+0

這是你提出的一個很好的觀點,這個想法已經超出了我的想法。我相信它在某種程度上是分散的。內存的涓滴增加是否僅僅是因爲碎片? – Samaursa 2010-10-31 22:15:21

+0

我會選擇這個作爲正確的答案並添加以下鏈接(其中指出刪除不一定會將內存釋放回系統):http://www.gnu.org/s/libc/manual/html_node/ Freeoc-after-Malloc.html#Freeoc-after-Malloc – Samaursa 2010-11-01 16:06:05

2

,如果你是它取決於一個CLR下(或虛擬機的垃圾收集器),或者你還在老模式(如C++,MFC等...)

當你周圍的GC - 你真的不能告訴,只有當你測試它足夠長的時間。 GC可以決定不清理你的對象現在...(有一個辦法,迫使它)

在本機應用程序,是的,一個足跡增加可能意味着泄漏。

有C++的一些工具(非常好的工具)是找到這些泄漏(谷歌devpartner或的BoundsChecker)

我想有一些工具用於C#和Java以及。

+0

我也加入valgrind內存檢查工具。 – 2010-10-31 20:38:30

+0

我能找到的唯一免費的檢漏儀工作良好的是視覺檢漏儀。不幸的是,各種SDK,如OGRE3D的一些組合,它崩潰W/O通知我任何泄漏的(最簡單的所有程序發生崩潰 - 例如初始化食人魔/ Havok的和退出)。還有其他免費的,簡單的泄漏檢測器,但它們也會崩潰(有時並非全部),尤其是當像Havok這樣的圖書館以不同的方式摧毀它們的對象時。他們也錯過了第三方圖書館造成的泄漏。我希望我能買得起更好的檢漏儀。 – Samaursa 2010-10-31 22:13:11

2

如果你的應用程序超出合理限度,這取決於你的應用程序,它做什麼,並繼續增加,直到最後你的過程足跡增加(會)上運行的虛擬內存不足,你肯定有內存泄漏。

1

嘗試內存分配測試:http://msdn.microsoft.com/en-us/library/e5ewb1h3%28VS.80%29.aspx

他們有很大的幫助。

但我注意到,應用程序確實會,如果你看一些因素來改變自己的內存消耗一點點。 Windows 7還可以在內存分配創建微胖修復bug:http://msdn.microsoft.com/en-us/library/dd744764%28VS.85%29.aspx

+0

我得說,這是一些非常有趣的信息,謝謝。我不知道windows有這樣一個容錯堆的東西。至於內存泄漏檢測,我正在處理相當多的有自己的內存管理器的庫,他們將泄漏檢測關閉。它可以檢測出數百個(如果不是數千個)泄漏,我知道肯定不是泄漏(例如Havok SDK) - Visual Leak Detector在這種情況下同意,但它有自己的無故障崩潰問題(我還有另一篇文章) – Samaursa 2010-10-31 22:05:58

0

我強烈建議嘗試的Visual Studio 2015年(社區版是免費的)。它配備了診斷工具,可幫助您分析內存使用情況;它可以讓你拍攝快照並查看堆中enter image description here