Garbage Collector en .NET - Partie 4
2020-10-04 par Badre BSAILA
Re-bienvenue dans la série dédiée à la gestion mémoire dans .NET. Je couvre dans cet article les notions de collection concurrente, non-concurrente, et d’arrière-plan GC. J’explore aussi les 2 types de GC: workstation-GC et server-GC.
Retrouvez aussi dans la série :
- Partie 1 - Tas managé, LOH, GC, Collection, Générations et Ségments.
- Partie 2 - Démonstration avec windbg.
- Partie 3 - Graphe des objets et références.
- Partie 4 - Workstation/Server GC et arrière-plan GC (article courant).
- Partie 5 - Compteurs de performance et événements ETW.
Collection concurrente
Comme je l’avais signalé sur la partie 1 : une collection bloque les threads de l’application .NET pour pouvoir faire le ménage dans la mémoire sans corrompre leurs états. On dit que la collection est non-concurrente dans ce cas. Ce qui est problématique car le GC ainsi ajoute de la latence aux applications. Avec .NET 3.5, Microsoft a introduit la notion de collection concurrente pour minimiser l’impact :
- La collection est exécutée par le CLR sur un thread à part, en parallèle à l’exécution de l’application pour la plupart du temps.
- Elle permet d’allouer la mémoire même si une collection est en cours.
- Une collection est concurrente que pour la génération 2 (collection complète) car celle des générations éphémères est souvent rapide.
- Configurable avec
<gcConcurrent enabled="true|false"/>
.
Cependant, elle a ces propres limites :
- Un objet fraîchement alloué (Génération 0) durant la collection complète est automatiquement promu à la génération 1.
- On ne peut pas étendre le tas durant la collection complète.
Arrière-plan-GC
Disponible depuis .NET 4, il remplace le GC concurrent et est activé par défaut. Il est exécuté sur un ou plusieurs threads séparées. On peut le désactiver via la même configuration <gcConcurrent enabled="true|false"/>
.
Il a les mêmes caractéristiques du GC concurrent et résout en plus quelques unes de ces limitations :
-
Quand l’arrière-plan GC a alloué assez de mémoire sur les ségments éphémères, le CLR peut déclencher une collection ‘ordinaire’ pour libérer la mémoire. Dans ce cas on qualifie la collection de 1ère plan-collection. Une 1ère plan-collection suspend tous les threads utilisateur et les threads de l’arrière plan-GC.
-
Capable d’étendre la mémoire du tas si besoin.
Workstation/Server GC
Le GC du .NET vient avec 2 saveurs au choix : Workstation-GC qui est le schéma traditionnel et présent depuis le début du .NET, et Server-GC qui est le format le plus récent (.NET 2.0), adapté pour les serveurs web. On peut configurer une application .NET pour utiliser une des deux selon ses cas d’usage.
Workstation-GC
Dédié aux applications clientes, c’est le type par défaut. Il est caractérisé par :
-
La collection s’exécute sur le thread utilisateur (Exécutant le code de l’application) qui a déclenché la collection.
-
C’est le mode utilisé sur les ordinateurs ayant un seul processeur.
-
Il supporte les GC concurrent (arrière-plan) et non-concurrent.
-
Le GC arrière-plan utilise un seul thread dédié et ne tombe jamais en timeout.
Server-GC
Adapté aux applications serveur. Il répond aux défis de scalabilité et de charge sur les machines servants des milliers de requêtes par second. Il se distingue par :
-
Pour chaque processeur, on crée un tas dédié (avec le tas classique et la LOH). Tous les tas sont collectés en même temps et sont accessibles par le code de l’application. Un objet dans le tas X peut référencer un autre dans le tas Y.
-
La collection est exécutée sur plusieurs threads qui y sont dédiés exclusivement : chacun s’occupant de son propre tas.
-
Vu que multiple threads collaborent pour le collection, elle est plus rapide que celle de workstation-GC.
-
Le server-GC consomme beaucoup de CPU, il vaut mieux avoir une seule application qui l’utilise sur un serveur donné : un serveur, ayant 4 processeurs et exécutant 12 applications en mode server GC, peut avec de la chance exécuter la collection sur toutes ces applications en même temps, on finira donc par exécuter 12 threads de collection sur le même processeur.
-
Il supporte aussi les GC concurrent (arrière-plan) et non-concurrent.
-
Le GC arrière-plan utilise un thread dédié par processeur dans la machine.
Références
-
Série Going Deep, épisode avec Maoni Stephens et Andrew Pardoe sur l’arrière-plan-GC.
-
Channel 9 : implémenter la collection en arrière-plan dans server-GC.
-
Microsoft Docs : Workstation/Server GC.
-
Microsoft Docs : Arrière-plan-GC.
Badre BSAILA, Ingénieur d'étude et développement .NET sénior