Garbage collector

De Banane Atomic
Version datée du 23 octobre 2017 à 14:48 par Nicolas (discussion | contributions) (→‎WeakReference)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
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

Appelé par le code.

Cs.svg
public void Dispose()
{
    // code libérant les ressources
    // ...

    // 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
    System.GC.SuppressFinalize(this);
}

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.