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

Resumen

En este artículo se 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 percibido y cómo puede malinterpretarse como una pérdida de memoria es true.

Más información

Pérdidas de memoria pueden hacer que una aplicación se quede sin recursos y pueden hacer que una aplicación se bloquee. Es importante identificar pérdidas de memoria. El problema de las pérdidas de memoria ha acosado a los desarrolladores en C y C++ durante años. En Microsoft Visual Studio 2005 o en Microsoft Visual Studio. NET, un paquete de recopilación de basura integral y memoria administrada pueden detener pérdidas de memoria, pero, en algunas circunstancias, puede parecer que un programa esté perdiendo memoria.

Definición de pérdida de memoria

Una pérdida de memoria se produce cuando la memoria se asigna en un programa y nunca se devuelve al sistema operativo, aunque el programa no utiliza la memoria ya. Los siguientes son los cuatro tipos básicos de pérdidas de memoria:
  • En un entorno de memoria administrada manualmente: dinámicamente asigna memoria y hace referencia a un puntero. El puntero se borrará antes de que se libera la memoria. Después de que se borra el puntero, la memoria ya no puede tener acceso a y, por tanto, no se puede liberar.
  • En un entorno administrado dinámicamente memoria: memoria es eliminada pero nunca recopilada, porque una referencia al objeto aún está activa. Porque una referencia al objeto aún está activa, el recolector de elementos no utilizados recoge nunca esa 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 recoger 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 uso a una parte de la memoria y libre el resto.
  • En cualquier entorno de memoria: memoria mala administración puede producir cuando se declara y nunca puede dejar ámbito muchos objetos grandes. Como resultado, memoria utiliza y nunca libera.

Discusión

Por el paquete de recopilación de basura que se implementa en el Microsoft.NET Framework, no es posible tener una pérdida de memoria en código administrado. Esto sugiere dos preguntas: ¿cómo puede producirse una pérdida de memoria? ¿Por qué parece 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 el tiempo de ejecución de.NET Framework no puede resolver ese problema.

Además, sólo puede parecer que un proyecto tenga una pérdida de memoria. Esta condición puede producirse si muchos objetos grandes (como objetos DataTable ) se declara y se agregan a una colección (como un conjunto de datos). Nunca se pueden liberar los recursos que poseen estos objetos y los recursos permanecen activos para toda la ejecución del programa. Esto parece ser una pérdida, pero en realidad es simplemente un síntoma de la forma en que la memoria se está asignando en el programa.

Por ejemplo, tiene un conjunto de datos. Cada vez que se ejecuta una nueva consulta, agregue un nuevo elemento de tabla de datos DataSet para contener los datos que se devuelven. Si hay grandes cantidades de datos que no se dan nunca de, los datos permanece activos siempre que el conjunto de datos todavía está en uso. Este caso suficientes veces, es posible que se agote la memoria. Esto no es una pérdida de memoria, pero en su lugar es un problema en la administración de 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: En este ejemplo es un fragmento de código. En este ejemplo se supone que Microsoft SQL Server está instalado en el equipo local y que el usuario que 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 tablas a la colección de conjuntos de datos ), los objetos se mantienen activos mientras la colección permanece activa. Si una colección se declara en el nivel global del programa, y se declara en todo el sistema y se agregan a que colección, esto significa aunque los objetos ya no están en el ámbito de objetos, los objetos aún permanecen activos porque 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 ve el programa en un monitor de rendimiento, esto parece ser una pérdida de memoria, pero no es así. 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 que esto sea una pérdida de memoria, pero el hecho de que el programa mantiene aumentando la cantidad de memoria utilizada puede hacerla parecer una pérdida de memoria.

Síntomas de pérdida de memoria

Cuando la cantidad de memoria que está usando un programa continúa aumentando durante la ejecución, esto es un síntoma de una pérdida de memoria. (Puede ver este recuento de memoria a través de un monitor de rendimiento). La cantidad de memoria que utiliza el sistema puede llegar a provocar el programa se ejecute sin recursos y bloqueo.

Referencias

La siguiente es una lista de temas de ayuda para obtener más información sobre 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 siguiente número de artículo para verlo en Microsoft Knowledge Base:

317297 hoja de ruta para la depuración se bloquea, pérdidas de memoria, 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):
Propiedades

Id. de artículo: 318263 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios