如何辨識記憶體遺漏通用語言執行階段中的詳細資訊

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:318263
結論
本文將告訴您哪些記憶體遺漏 (Memory Leak) 是,並列出記憶體遺漏 (Memory Leak) 的可能原因。此外,本文將告訴您觀察的記憶體遺漏,以及錯如何它可以被譯成,則為 True 的記憶體遺漏。
其他相關資訊
記憶體遺漏 (Memory Leak) 可能會造成應用程式的資源用盡,可能會造成應用程式當掉。請務必找出記憶體遺漏 (Memory Leak)。記憶體遺漏 (Memory Leak) 的問題有多年 plagued C 和 C + + 中的開發人員。在 Microsoft Visual Studio 2005 中或在 Microsoft Visual Studio.NET,完整的記憶體回收集合套件和 Managed 的記憶體可以停止記憶體遺漏但是,在某些情況下,程式可能會出現要被遺漏記憶體。

記憶體遺漏的定義

即使程式未再使用記憶體有記憶體流失的現象發生可會發生 [當記憶體配置在程式中,且永遠不會傳回來讓作業系統。記憶體遺漏 (Memory Leak) 的四種基本型別如下:
  • 在手動 Managed 的記憶體環境: 動態配置和指標參考記憶體。指標會清除前釋放記憶體。指標清除之後記憶體無法再存取,因此無法被釋放。
  • 在動態 Managed 的記憶體環境中: 記憶體處置的但絕不能收集因為仍在作用中物件的參照。因為物件的參照仍在使用中所以記憶體回收行程永遠不會收集該記憶體。就會發生這個問題由系統或程式設定為參考。
  • 在動態 Managed 的記憶體環境: 的記憶體回收行程可以收集並將免費記憶體但從未它傳回給作業系統。當記憶體回收行程無法移動仍在的物件使用一個部份記憶體,以及釋放其餘部分時,就會發生這個問題。
  • 在任何記憶體環境: 劣記憶體管理可能會造成許多大型物件會宣告並永遠不會允許離開範圍時。 如此一來記憶體使用與永遠不會釋放。

討論區

因為記憶體回收集合封裝在 Microsoft.NET Framework 中實作的不可能在 Managed 程式碼中有記憶體流失。這會建議兩個問題: 如何再記憶體遺漏可能是? 為什麼它不會顯示您有記憶體遺漏?

記憶體遺漏時,就會發生在.NET Framework 應用程式中您使用 Unmanaged 程式碼當做應用程式的一部份。這個 Unmanaged 程式碼可以遺漏記憶體和.NET Framework 執行階段不能解決該問題。

此外,專案可能只會有記憶體流失。如果許多的大型物件 (例如 DataTable 物件) 是宣告,然後加入至集合 (例如 資料集),就會發生這種情況。這些物件所擁有的資源可能永遠不會被釋放,而資源剩下的活著對於整個執行的程式。這似乎是一個遺漏但實際上只是在程式中配置記憶體的方式的徵兆。

例如,您擁有 資料集。將執行新的查詢每次您新 DataTable 元素新增至該 資料集,以容納傳回資料。如果是大量的資料絕對不會處置的資料,只要 資料集 仍處於使用停留活著。發生這種情況時次數夠多很可能用完記憶體。這不是記憶體遺漏,但是很中管理記憶體問題的相反的。請參閱下列的程式碼範例:
  Dim DS As DataSet  Dim cn As New SqlClient.SqlConnection("data source=localhost;initial catalog=Northwind;integrated security=SSPI")  cn.Open()   Dim da As New SqlClient.SqlDataAdapter("Select * from Employees", cn)  Dim i As Integer  DS = New DataSet()  For i = 0 To 1000      da.Fill(DS, "Table" + i.ToString)  Next				
注意 這個範例是只是程式碼片段。本範例假設本機電腦上已安裝 Microsoft SQL Server,而且使用者正在執行這個程式碼是否有隨附於 SQL Server Northwind 資料庫的存取權。

雖然這段程式碼是很明顯地降低執行效能並不實用,它是用來示範是否將物件新增至集合 (例如,將資料表加入至 資料集 集合),物件會保持作用中只要集合保持作用。如果該程式的全域的層級宣告集合,而且整個程式宣告或加入至該集合,這表示即使該物件已經不在範圍中的物件,物件保持作用,因為仍被參考。

每次發生這種情況的程式正在使用會增加記憶體數量。該記憶體不會降低直到程式結尾或從集合物件的發行。當您監看效能監視器上的程式時,這似乎是記憶體遺漏,但它不是。程式仍然擁有之記憶體的控制權,但已選擇不要釋放它。程式仍有控制項的事實防止這被記憶體流失,但事實程式會持續增加使用的記憶體數量可讓它似乎是有記憶體流失的現象發生。

記憶體遺漏的徵狀

當一個程式正在使用數量持續增加執行期間時,這是記憶體的記憶體遺漏的徵兆。(您可以觀賞此計數透過效能監視器的記憶體)。程式使用的記憶體數量可能最後會使程式執行的資源用盡及損毀。
参考
以下是記憶體和其管理的相關資訊的 [說明] 主題清單:
  • GC 類別
  • 記憶體效能計數器
  • 自動記憶體管理
  • Unmanaged 程式碼與互通
如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
317297偵錯擱置、 記憶體遺漏 (Memory Leak)、 死結,以及 Visual Basic.NET 中的競爭情形的藍圖
如需詳細資訊請造訪下列 Microsoft 開發人員網路 (MSDN) 網站:
CLR

警告:本文為自動翻譯

內容

文章識別碼:318263 - 最後檢閱時間:12/06/2006 23:18:59 - 修訂: 4.7

Microsoft Common Language Runtime (included with the .NET Framework) 1.0, Microsoft Common Language Runtime (included with the .NET Framework 1.1), Microsoft Visual Studio 2005 Standard Edition, Microsoft Visual Studio 2005 Professional Edition, Microsoft Visual Studio .NET 2003 專業版, Microsoft Visual Studio .NET 2003 Enterprise Architect, Microsoft Visual Studio .NET 2003 Enterprise Developer, Microsoft Visual Studio .NET 2003 Academic Edition, Microsoft Visual Studio .NET 2002 Professional Edition, Microsoft Visual Studio .NET 2002 Enterprise Architect, Microsoft Visual Studio .NET 2002 Enterprise Developer, Microsoft Visual Studio .NET 2002 Academic Edition, Microsoft Visual Basic 2005, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Visual C# .NET 2003 標準版, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual J# .NET 2003 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbinfo KB318263 KbMtzh
意見反應