Garbage collector

De Banane Atomic
(Redirigé depuis IDisposable)
Aller à la navigationAller à la recherche

Fonctionnement

  1. Parcourt la heap
  2. Pour chaque élément de la génération 0, regarde s'il est référencé par un root item (static field, method parameter, local variable, CPU register)
    Passe aux autres générations si trop peu de mémoire a été libérée.
    1. Si oui, l'élément est marqué comme vivant
  3. Opération de collecte
    1. Tous les threads sont gelés
    2. Regroupe les éléments vivants et supprime tous les autres
Le GC se lance quand il n'y a plus de place pour créer un objet dans la heap ou quand Windows atteint un niveau de mémoire faible.

stack / heap

stack types valeur, référence vers les objets stockés dans la heap.
Vidée à la fin de chaque méthode, non-géré par le GC.
heap types références.
Géré par le GC.

Forcer la collecte des déchets

Cs.svg
GC.Collect();
GC.WaitForPendingFinalizers();

Finalizer

Appelé par le GC.

Cs.svg
public class MyClass
{
    ~MyClass()
    {
        // This code is called when a garbage collection occurs
    }
}

IDisposable

Cs.svg
// Sealed class
public sealed class Foo1 : IDisposable
{
    public void Dispose()
    {
        // dispose resources
    }
}

// Simple implementation
public class Foo2 : IDisposable
{
    public void Dispose()
    {
        Dispose(true);
        // retire l'objet de la liste de finalisation.
        // on s'est occupé nous-même de libérer les ressources, le GC n'a plus besoin d'appeler le finaliseur
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        // dispose resources
    }
}

// Implementation with a finalizer
public class Foo3 : IDisposable
{
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        // dispose resources
    }

    ~Foo3()
    {
        Dispose(false);
    }
}

// Base disposable class
public class Foo4 : DisposableBase
{
    protected override void Dispose(bool disposing)
    {
        // dispose resources

        // do not forget to call base
        base.Dispose(disposing);
    }
}

WeakReference

Le GC ne peut pas collecter un objet qui a une strong ref sur lui.
Le GC peut pas collecter un objet qui a une weak ref sur lui, la weak ref permet à cet objet d'être accessible tant qu'il n'a pas été collecté.
Les weak ref sont utiles pour les objets qui utilisent beaucoup de mémoire, mais qui peuvent être recréés facilement s'ils sont collectés par le GC.