簡體   English   中英

在Gen2中存在大量對象時,使用WinDbg查找內存泄漏

[英]Find memory leaks with WinDbg when lots of objects are present in Gen2

我的.NET應用程序中存在內存問題,在初始化和加載所有內容之后,我的應用程序開始在Gen2堆中消耗大約1GB。 它隨着時間的推移(4-5小時)慢慢消耗Gen2堆中的4GB。 我已經使用WinDbg來分析我看到的一些對象類型(以及相關的內存使用情況)正在增加的事情。

實例中增長的所有對象(和mem用法)都由相同的父對象類型引用。 此父對象類型有大約3900個實例 - 這永遠不會更改。 不知何故,我正在將子對象添加到其中一些父實例中,但我沒有很好的方法來查看正在添加的3900個實例中的哪一個。

!DumpHeap -mt會顯示我所有的父類型,但大小都是一樣的,因為它不計算孩子。

!ObjSize也將計算子項的大小,但一次只能獲取一個參數(或所有類型的所有對象 - 不僅僅是我的父類型 - 這是太多的對象)

查看子對象並將它們追溯到父對象是沒有用的,因為有幾百萬種這樣的類型,我沒有看到某種方式來進行某種聚合跟蹤。

像CLRProfiler和ANTS這樣的工具會使我的app太慢(ANTS不那么頻繁),以便在任何合理的時間內解決問題。

我已經嘗試使用它通常運行的一小部分數據來運行我的應用程序,以便使調試更容易,但我不會在這里遇到內存問題。 我認為在我的整個數據集中存在一些引起奇怪事情的邊緣情況,但我不知道這些邊緣情況是什么,以便將它們隔離成我的整個數據集的子集。

已經廣泛閱讀並且看不到任何人建議在Gen2中有多少物體應該在那里做什么以及少量相同類型的物體不斷增加時。

任何提示將非常感激。

有趣的謎題。 如你所知,當對象幸存下來時,它們會被提升為gen2,因為它們被長期存在的東西所引用。 你沒有說這是什么樣的應用程序 - asp.net,WPF,winforms等等所以我們必須做出一些猜測。

您可以嘗試的一種策略是記錄。 你說有3900個“父對象”實例,有些東西被添加到 - 你可以在接受新對象的父對象上檢測方法嗎? 也許通過記錄這些新增內容,您可以了解它們的來源。

我假設您正在使用SOS。 更好的選擇是使用PSSCOR2PSSCOR4 (取決於您所使用的運行時版本)。 !dumpheap的PSSCOR版本有一個額外的delta列,可以幫助您檢測哪些實例隨時間增長。

您可以在父類型的所有對象上使用!objsize

.foreach (address {!dumpheap -short -type MyParentType}) {!objsize ${address}}

或者通過方法表,如果您的類名不夠獨特

 !name2ee MyModule MyParentType ; *** to get the method table
 .foreach (address {!dumpheap -short -mt <methodtable>}) {!objsize ${address}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM