Pérdidas de cómo identificar la memoria en common language runtime

Seleccione idioma Seleccione idioma
Id. de artículo: 318263 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo explica qué pérdidas de memoria son y muestra algunas posibles causas de pérdidas de memoria. Además, este artículo describe la pérdida de memoria que se percibe y cómo puede malinterpretarse como una pérdida de memoria es true.

Más información

Pérdidas de memoria pueden provocar una aplicación se ejecute agota los recursos y pueden hacer que una aplicación se bloquee. Es importante identificar pérdidas de memoria. El problema de pérdidas de memoria ha sufrían los desarrolladores de C y C++ para años. En Microsoft Visual Studio 2005 o en Visual Studio.NET, un paquete de colección completa de elementos no utilizados y la memoria administrada pueden dejar de pérdidas de memoria, pero en algunas circunstancias, puede parecer un programa que esté perdiendo memoria.

Definición de pérdida de memoria

Una pérdida de memoria se produce cuando se asigna en un programa de memoria y nunca se devuelve al sistema operativo, incluso aunque el programa no utiliza ya la memoria. Éstos son los cuatro tipos básicos de pérdidas de memoria:
  • En un entorno de memoria administrada manualmente: memoria se asigna dinámicamente y se hace referencia a un puntero. El puntero se borrará antes de que se libera la memoria. Después se borrará el puntero, la memoria ya no puede obtener acceso y, por lo tanto, no puede liberarse.
  • En un entorno administrado dinámicamente memoria: memoria se elimina pero no recopilado nunca, porque una referencia al objeto aún está activa. Ya hay una referencia al objeto sigue activa, el recolector de elementos no utilizados recopila nunca que la memoria. Esto puede ocurrir con una referencia establecida por el sistema o el programa.
  • En un entorno administrado dinámicamente memoria: el recolector de elementos no utilizados puede recopilar y libre la memoria pero nunca lo devuelve al sistema operativo. Esto ocurre cuando el recolector de elementos no utilizados no puede mover los objetos que aún estén en utilizan para una parte de la memoria y liberar el resto.
  • En cualquier entorno de memoria: memoria bajo administración puede producir cuando se declara y nunca permite dejar ámbito muchos objetos grandes. Como resultado, se utiliza memoria y no se liberan nunca.

Discusión

Porque el paquete de colección de elementos no utilizados que se implementa en Microsoft .NET Framework, no es posible tener una pérdida de memoria en código administrado. ¿Esto sugiere dos preguntas: cómo, a continuación, se puede producir una pérdida de memoria? ¿Por qué lo aparece que haya una pérdida de memoria?

Cuando se utiliza código no administrado como parte de la aplicación, puede producirse una pérdida de memoria en una aplicación de .NET Framework. Este código no administrado puede perder memoria y .NET Framework runtime no puede resolver ese problema.

Además, un proyecto sólo puede aparecer con una pérdida de memoria. Esta condición puede producirse si muchos objetos grandes (tales como objetos DataTable ) se declaran y, a continuación, se agregan a una colección (como DataSet ). Nunca pueden liberarse los recursos que poseen estos objetos y los recursos quedan activos para todo el que se ejecuten del programa. Esto parece ser una pérdida, pero realmente es sólo un síntoma de la forma que se se asigna memoria en el programa.

Por ejemplo, tiene un DataSet . Cada vez que se ejecuta una nueva consulta, agregue un nuevo elemento de DataTable a ese conjunto de datos para contener los datos que se devuelven. Si hay grandes cantidades de datos que nunca se deshacerse de, los datos permanece activos siempre que sea el DataSet todavía en uso. Si esto ocurre suficientes veces, es posible ejecutar fuera de la memoria. No es una pérdida de memoria, pero en su lugar es un problema de administrar la memoria. Vea el ejemplo de código siguiente:
  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
				
Nota este ejemplo es sólo un fragmento de código. Este ejemplo se supone que Microsoft SQL Server está instalado en el equipo local y que el usuario que se está ejecutando este código tiene acceso a la base de datos Northwind que se incluye con SQL Server.

Aunque este código es obviamente ineficaz y no es práctico, pretende demostrar que si se agregan objetos a una colección (como agregar las tablas a la colección DataSet ), los objetos se mantienen activos mientras la colección permanece activa. Si se declara una colección en el nivel global del programa, y objetos se declarado en todo el sistema se agrega a que la colección, esto significa aunque los objetos ya no están en ámbito, los objetos permanecen activos ya que todavía se hace referencia.

Cada vez que esto ocurre, la cantidad de memoria que el programa está utilizando aumenta. La memoria no disminuye hasta el final del programa o la versión de los objetos de la colección. Cuando se observa que el programa en un monitor de rendimiento, esto parece ser una pérdida de memoria, pero no es. El programa aún tiene control sobre la memoria, pero ha decidido no liberarla. El hecho de que el programa aún tiene control impide esta pérdida de memoria, pero el hecho de que el programa mantiene aumentar la cantidad de memoria utilizada puede hacer que parezca que una pérdida de memoria.

Síntomas de pérdida de memoria

Cuando la cantidad de memoria que está utilizando un programa continúa aumentar durante la ejecución, esto es un síntoma de una pérdida de memoria. (Puede observar este contador de memoria a través de un monitor de rendimiento.) La cantidad de memoria que utiliza el sistema finalmente puede provocar que el programa ejecute fuera de los recursos y bloqueo.

Referencias

El siguiente es una lista de temas de ayuda para obtener más información acerca de la memoria y su administración:
  • Clase GC
  • Contadores de rendimiento de memoria
  • Administración de memoria automática
  • Interoperación con código no administrado
Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
317297Guía básica para la depuración se bloquea, pérdidas de memoria, los interbloqueos y condiciones de anticipación en Visual Basic.NET
Para obtener más información, visite los siguientes sitios Web de Microsoft Developer Network (MSDN):
http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

http://msdn.microsoft.com/en-us/library/fz5w87ad.aspx

http://msdn.microsoft.com/en-us/library/kxx6e7z6.aspx

http://msdn.microsoft.com/en-us/library/s3aw423e.aspx

Propiedades

Id. de artículo: 318263 - Última revisión: miércoles, 06 de diciembre de 2006 - Versión: 4.7
La información de este artículo se refiere a:
  • 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 Professional
  • 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
  • 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
  • Microsoft Visual C++ .NET 2002 Standard
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual J# .NET 2003 Standard Edition
Palabras clave: 
kbmt kbvs2005swept kbvs2005applies kbinfo KB318263 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 318263

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com