你目前正处于脱机状态,正在等待 Internet 重新连接

如何识别内存泄漏公共语言运行库中

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 318263
概要
本文讨论泄漏是何种内存,并列出了一些可能的原因的内存泄漏。此外,本文讨论了察觉到的内存泄漏和如何它可能被误解为 true 的内存泄漏。
更多信息
内存泄漏可以导致应用程序的资源不足,可能会导致应用程序崩溃。很重要识别内存泄漏。内存泄漏问题已侵袭 C 和 c + + 中的开发人员多年。在 Microsoft Visual Studio 2005 中或在 Visual Studio.net 中 Microsoft,全面垃圾回收集合包和托管的内存可以停止内存泄漏,但某些情况程序似乎正在泄漏内存。

内存泄漏的定义

即使程序没有再使用内存,内存泄漏会出现时内存分配程序中,并且永远不会返回到操作系统的系统。以下是四种基本类型的内存泄漏:
  • 在手动管理的内存的环境中: 内存是动态地分配和引用的指针。指针被删除之前释放内存。指针被清除后,内存不再可访问,因此无法被释放。
  • 在动态托管的内存的环境中: 内存的释放,但永远不会收集因为对对象的引用是否仍处于活动状态。仍处于活动状态对该对象的引用是垃圾回收器将永远不会收集该内存。这可能出现的系统或程序集的引用。
  • 在动态托管的内存的环境中: 的垃圾回收器可以收集和可用内存但永远不会返回给操作系统。当垃圾回收器不能移动仍处于该对象使用的内存的一个部分,并释放其余部分时,会出现这种情况。
  • 在任何环境中的内存: 低内存管理可以产生许多大对象的声明并永远不会允许离开作用域。 如此一来内存使用且永远不会释放。

讨论

由于在 Microsoft.net 框架中实现的垃圾回收集合数据包,它不可能在托管代码中有内存泄漏。这要求两个问题: 如何然后会出现内存泄漏? 它为什么显示您有内存泄漏?

使用非托管的代码作为应用程序的一部分时,在.net 框架应用程序中可能发生内存泄漏。此非托管的代码可以泄漏内存,和.net 框架运行时不能解决该问题。

此外,项目可能仅有内存泄漏显示。如果许多大的对象 (如 数据表 对象) 是声明,然后添加到集合 (如 数据集),则会发生这种情况。可能永远不会释放这些对象拥有的资源和资源保持处于活动状态的整个运行的程序。这似乎是一个泄漏但实际上它只是在程序中分配内存的方式的症状。

例如对于您有一个 数据集。每次运行新的查询时,您添加新的 数据表 元素,该 数据集 以容纳所返回的数据。如果存在大量的数据,您永远不会处理的数据将保持处于活动状态,只要 数据集 是仍在使用。如果出现足够次数此问题可能是内存不足,无法运行。这不是一个的内存泄漏,但它实际上是在管理内存问题。请参阅下面的代码示例:
  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 中包含 罗斯文 数据库。

尽管此代码是显然是效率低下,并不实际,它是为了演示是否将对象添加到集合 (如将表添加到 数据集 集合),对象保持活动,只要该集合保持活动状态。如果集合在程序的全局级别上声明和对象被声明的整个程序并添加到该集合,这意味着,即使该对象不再是作用域中,对象保持处于活动状态,因为它们仍被引用。

每次发生这种情况的程序正在使用的增加的内存量。内存不会降低直到结束程序或从集合中对象的版本。当您监视在性能监视器程序时,这似乎是一个的内存泄漏,但它不是。程序仍对内存的控制,但已选择不将其释放。这一事实程序仍有控制防止这一的内存泄漏,但该程序保持增加所使用的内存量这一事实可以使它似乎是内存泄漏。

内存泄漏的症状

当一个程序正在使用量将继续执行过程中提高时,这是内存的内存泄漏的症状。(您可以监视内存通过性能监视器的该计数)。程序使用的内存量最终会导致程序运行的资源和崩溃。
参考
以下是有关内存和其管理的详细信息的帮助主题的列表:
  • 垃圾回收类
  • 内存性能计数器
  • 自动内存管理
  • 与非托管代码交互操作
有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
317297对于调试挂起、 内存泄漏、 死锁和在 Visual Basic.net 中的争用条件的路线图
有关更多的信息,请访问下面的 Microsoft 开发人员网络 (MSDN) 的网站:
CLR

警告:本文已自动翻译

属性

文章 ID: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, Microsoft Visual Studio .NET 2003 Professional Edition, 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 专业版, Microsoft Visual Studio .NET 2002 企业级结构设计版, Microsoft Visual Studio .NET 2002 企业级开发版, Microsoft Visual Studio .NET 2002 Academic Edition, Microsoft Visual Basic 2005, Microsoft Visual .NET 2002 标准版, Microsoft Visual Basic .NET 2003 标准版, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 标准版, Microsoft Visual C# .NET 2003 标准版, Microsoft Visual C# .NET 2002 标准版, Microsoft Visual J# .NET 2003 Standard Edition

  • kbmt kbvs2005swept kbvs2005applies kbinfo KB318263 KbMtzh
反馈