urbanos sólidos solidos residuos registro produccion per organicos inec gestión generacion estadisticas ecuador capita ame c# .net garbage-collection

c# - sólidos - Recolección de basura en.NET(generaciones)



residuos solidos ecuador pdf (7)

He leído un montón de artículos de rendimiento .NET que describen la recolección de basura Gen1, Gen2 y los objetos que han sobrevivido a las generaciones.

¿Por qué los objetos sobreviven a la colección?

¿Qué es la fijación?

¿Cómo aprendo más sobre esto?



La fijación se utiliza para evitar que el recolector de basura reubique los objetos. Puede perjudicar el rendimiento al restringir lo que puede hacer el recolector de basura. En general, los objetos fijados deben fijarse lo más corto posible.



Una de las razones por las que tiene varias generaciones en un recolector de basura es para evitar perder la memoria debido a la fragmentación.

Cada llamada a una función puede significar la creación y eliminación de una colección de múltiples objetos, por lo que el montón de memoria para su programa tiende a fragmentarse muy rápidamente. Esto deja agujeros detrás que no son muy utilizables. El resultado es que su programa necesita ser des-fragmentado periódicamente, al igual que un disco duro. Esto es parte de lo que sucede durante una colección.

Cuando un objeto sobrevive a una colección, se traslada a una generación más longeva según la teoría de que si sobrevivía a una colección, probablemente sobrevivirá a otras. Así, las generaciones posteriores tienen menos vueltas y no se fragmentan tanto. Esto significa que su programa pasa menos tiempo en general haciendo malabarismos para limpiar agujeros y desperdicia menos memoria. Esto también es una mejora respecto a la administración de memoria tradicional (malloc / free o new / delete), que lo dejó en manos del sistema operativo para administrar cualquier fragmentación de la memoria.

La razón por la que un objeto sobrevive a la colección es porque hay algo en algún lugar que todavía está "en el alcance" y contiene una referencia a ese objeto. Hay algunas formas en que puede hacer que esto suceda y luego olvidarse de la referencia, por lo que es posible "filtrar" la memoria en el código administrado.

A veces la gente se GC.Collect() tentada a llamar a GC.Collect() en un esfuerzo por conseguir que el recolector de basura limpie algo. Tal vez hayan descubierto que tienen una fuga, o creen que la memoria se está sobre-fragmentando. Debes resistirte a esos impulsos. Si bien la recolección de basura en .Net no es perfecta, es muy buena, y es casi seguro que es mucho mejor para limpiar la memoria que usted. Las probabilidades son que si un objeto puede y debe ser recolectado, lo será. Recuerde que llamar a GC.Collect() puede empeorar las cosas al ayudar al recolector de basura a mover los objetos a una generación más alta, y así mantenerlos por más tiempo de lo que sería.

En cambio, si sospecha que tiene una fuga, busque en su propio código algo como una variable global o estática que pueda contener una referencia a muchos otros elementos. La única vez que debe llamar a GC.Collect() es cuando tiene información sobre la naturaleza del programa que no está disponible para el recolector de basura, y eso es bastante raro ya que el GC conoce todas las referencias que ha creado.

"Fijación" es para cuando necesita pasar un objeto a una biblioteca no administrada. El recolector de basura puede mover la ubicación física de un objeto en la memoria, por lo que debe "fijarlo" en un lugar o el puntero utilizado por la biblioteca no administrada podría volverse inválido. Un objeto fijado no puede ser recolectado, por lo que no debe fijar un objeto por más tiempo del necesario.


http://blogs.msdn.com/maoni/ es un buen recurso.
Hacer preguntas aquí también ayuda :)

Para sus preguntas:

¿Por qué los objetos sobreviven a la colección?
Los objetos sobreviven a una colección cuando son "objetos vivos" u "Objetos accesibles". Los objetos accesibles son objetos donde hay una referencia a ellos desde otro objeto que está en:

  1. La pila
  2. La cola de finalización.
  3. otro objeto en una generación superior (por ejemplo, un objeto Gen2 que contiene una referencia a un objeto Gen0)
  4. La tabla de manejador (una estructura de datos utilizada por el CLR, y requiere una publicación separada por sí misma :))

¿Qué es el anclaje?
Fijar significa asegurarse de que el objeto no se mueva en la memoria. los objetos se mueven en la memoria como resultado de un GC de compactación, puede crear un GCHandle de pines escritos si quiere anclar un objeto, también se realiza un anclaje automático detrás de la escena para los objetos que se pasan al código nativo a través de PInvoke (como las cadenas que son pasado como salida, el búfer interno se fija durante la llamada a PInvoke).

Visite http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx para ver un buen ejemplo de GCHandle.



This es un artículo interesante sobre el tema que puede encontrar informativo.