簡體   English   中英

確定堆上對象的對象分配發生的位置

[英]Determining where object allocations for objects on the heap occurred

是否有任何工具可以從正在運行的應用程序中獲取堆轉儲並根據源代碼的創建位置確定/分組對象?

沒有更改源代碼,理想情況下是免費的。

那么來自ANTS的.NET Memory Profiler呢? 也許CLR Profiler。

如果創建內存轉儲,則無法使用該信息。 為了收集它,您必須在進程運行時監視該進程。 您可以通過WinDbg啟動應用程序並在您感興趣的所有構造函數上設置斷點(希望您不希望查看每個對象)。

如果創建斷點,那么它會轉儲堆棧,您將擁有該對象的創建點。 但是,請記住,在GC期間對象可能會移動,這會使堆疊對象變得困難(在某些情況下甚至是不可能的)。

由於您的問題標記有性能和分析,因此我認為您希望減少內存分配。 為什么不通過查看堆來查看創建的對象的數量(或者可能查看創建的最大對象)。 然后瀏覽源代碼並找出創建此類實例的位置。

正如其他人建議的內存分析器, Memprofiler絕對是最先進的(我已經嘗試過所有現有的.NET分析器)。 它有14天的試用期。

您需要一個.NET內存分析器。 這些工具允許您遵循垃圾收集堆上的對象圖,並且在識別內存泄漏源方面非常有用。 雖然它們可能不一定會告訴您創建對象的方法,但它們會告訴哪些類占用了哪些類,並允許您對gc堆的快照進行區分。 它們不需要修改源代碼。 您可能想看看什么是一些好的.NET Profilers?

當我們遇到瓶頸時,我們的QA團隊會在這里使用http://www.jetbrains.com/profiler/來處理此類問題。 我很確定它會通過方法調用給你一個分配列表。 我會安裝它並檢查:)

好舊的windbg + sos + pdb將進行傾銷。 至於“源代碼在哪里創建”部分 - 沒有儀器或注入是不可能的。

暫無
暫無

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

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