簡體   English   中英

如何確定應用程序的哪一部分正在泄漏內存?

[英]How can I determine what part of my application is leaking memory?

我已經實現了Dispose ...在所有支持它的地方。 我正在刪除所有事件處理程序。 我沒有在調用本機代碼。

我什至遍歷每個字典,並將值設置為null,然后在所有項目上調用.Clear()。

題:

如何找出我的代碼在哪里泄漏?

我首先通過在一夜之間進行測試發現了泄漏。 它使用固定數量的內存,因此它應該增長然后變得有些靜態。 然后,我像這樣使前台線程顯示內存:

            if (key.KeyChar == 'g')
             {
                long pre = GC.GetTotalMemory(false);
                long post = GC.GetTotalMemory(true);
                Console.WriteLine("{2} Pre:{0}  \tPost:{1}", pre, post, System.DateTime.Now);
                 GC.Collect();
              }

我運行了幾次(超過幾個小時,不時按下“ g”),並且看到這個數字不斷增加。

追蹤問題的最佳方法是使用內存分析器...有很多選擇。

.NET內存分析工具

確保您使用

try
{
}
finally 
{ 
   youDisposableObject.Dispose(); 
} 

要么

using (yourDisposableObject) {}

到您實施的每個對象“處置”

如果您對某些對象實施了終結器,則無需刪除它們

如果之后仍然無法修復,則必須使用內存分析器

還有,描述了如何使用SOS.dll做的一篇文章在這里和更全面的一個位置

根據您使用的Visual Studio版本(Premium或Ultimate),您還可以使用常規的代碼分析工具來幫助查找代碼中可能導致內存泄漏的問題。 這里詳細)

當然,在托管代碼中,內存泄漏與非托管代碼中的內存泄漏有些不同。 在非托管代碼中,您在其中顯式分配和釋放內存的情況下,內存泄漏是由於無法重新分配內存而引起的。

在.NET中,內存泄漏源於掛在對象上的時間比預期的長。 只要遵循在可能的情況下使用using語句的最佳做法,並仔細規划變量的范圍,就可以在很大程度上避免這種情況。

我只是在我的C#應用​​程序中遇到了同樣的問題,並且使用了(實際上是試用版) dotTrace內存探查器 ,這非常有幫助。

定位泄漏發生的實際代碼行仍需要花費一些時間。 因此,不要指望該工具立即識別出罪魁禍首。

暫無
暫無

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

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