我有一個.net項目,它使用C++項目並且吃了很多內存。計數「新」和「刪除」字節
我不知道是否有快速簡單的方法來計算由刪除操作員釋放的新流出字節分配的流入字節。添加一些日誌或其他東西。
這兩個操作符的源代碼都由Visual Studio提供,所以我可以破解它。
問題是我可以看到巨大的VM消耗,我想調查爲什麼。我嘗試了幾種內存分析器,但沒有人可以處理非託管C++ .NET分配應用
我有一個.net項目,它使用C++項目並且吃了很多內存。計數「新」和「刪除」字節
我不知道是否有快速簡單的方法來計算由刪除操作員釋放的新流出字節分配的流入字節。添加一些日誌或其他東西。
這兩個操作符的源代碼都由Visual Studio提供,所以我可以破解它。
問題是我可以看到巨大的VM消耗,我想調查爲什麼。我嘗試了幾種內存分析器,但沒有人可以處理非託管C++ .NET分配應用
通常內存分析工具中像Valgrnid或的Rational Purify的可以幫助您配置文件的程序內存使用率。
如果你還是希望有自己的實現,
您可以通過重載他們更換全球new
和delete
運營商和自己的重載操作符裏面可以維持分配的內存的數量。
如果您選擇/被迫遵循第二個選項,需要注意某些方面,您可以在此答案中閱讀詳細信息here。
如果使用STL:
的STL容器類反過來使用全球new
& delete
運營商分配。因此,如果您替換全局運算符,則STL將使用它們而不是std new和delete運算符。
+1,但有些類重載'operator new',這些類應該完成相同的操作。 – sharptooth
Als,Rational Purify DOES不計算.NET應用程序的非託管分配。它也提供C++分析,但是我的應用程序在MemoryViolationException的那個模式下崩潰,所以它對我來說很沒用。還有一些不明確的。我的第三方庫使用STL。 STL容器調用new並在某處刪除。我應該在哪裏重載操作員? –
@Captain Comic:更新了回答你的疑問。至於怎麼做,請參考鏈接。 –
您可以使用windbg附加並使用!heap -s
命令開始您的調查。
我不確定你的平臺,但在許多平臺上,你可以使用[DTrace](http://hub.opensolaris.org/bin/view/Community+Group+dtrace/WebHome)觀察內存泄漏。 – 2011-08-04 12:17:00