Notions de base du garbage collectionFundamentals of garbage collection

Dans le Common Language Runtime (CLR), le garbage collector a un rôle de gestionnaire de mémoire automatique.In the common language runtime (CLR), the garbage collector serves as an automatic memory manager. Il fournit les avantages suivants :It provides the following benefits:

  • Il vous permet de développer votre application sans avoir à libérer de la mémoire.Enables you to develop your application without having to free memory.

  • Il alloue efficacement les objets sur le tas managé.Allocates objects on the managed heap efficiently.

  • Il libère les objets qui ne sont plus utilisés, efface leur mémoire et garde la mémoire disponible pour les futures allocations.Reclaims objects that are no longer being used, clears their memory, and keeps the memory available for future allocations. Les objets managés obtiennent automatiquement un contenu propre au démarrage, ce qui fait que leurs constructeurs n'ont pas à initialiser chaque champ de données.Managed objects automatically get clean content to start with, so their constructors do not have to initialize every data field.

  • Il sécurise la mémoire en s'assurant qu'un objet ne peut pas utiliser le contenu d'un autre objet.Provides memory safety by making sure that an object cannot use the content of another object.

Cette rubrique décrit les concepts fondamentaux du garbage collection.This topic describes the core concepts of garbage collection.

Notions de base de la mémoireFundamentals of memory

La liste suivante résume les concepts importants de la mémoire CLR.The following list summarizes important CLR memory concepts.

  • Chaque processus possède son propre espace d'adressage virtuel séparé.Each process has its own, separate virtual address space. Tous les processus sur le même ordinateur partagent la même mémoire physique et le fichier d'échange s'il en existe un.All processes on the same computer share the same physical memory, and share the page file if there is one.

  • Par défaut, sur les ordinateurs 32 bits, chaque processus a un espace d'adressage virtuel en mode utilisateur de 2 Go.By default, on 32-bit computers, each process has a 2-GB user-mode virtual address space.

  • En tant que développeur d'applications, vous travaillez uniquement avec l'espace d'adressage virtuel et ne gérez jamais directement la mémoire physique.As an application developer, you work only with virtual address space and never manipulate physical memory directly. Le garbage collector alloue et libère la mémoire virtuelle pour vous sur le tas managé.The garbage collector allocates and frees virtual memory for you on the managed heap.

    Si vous écrivez du code natif, vous utilisez des fonctions Win32 pour utiliser l'espace d'adressage virtuel.If you are writing native code, you use Win32 functions to work with the virtual address space. Ces fonctions allouent et libèrent la mémoire virtuelle pour vous sur les tas natifs.These functions allocate and free virtual memory for you on native heaps.

  • La mémoire virtuelle peut être dans trois états :Virtual memory can be in three states:

    • Libre.Free. Il n'existe aucune référence au bloc de mémoire et celui-ci est disponible pour allocation.The block of memory has no references to it and is available for allocation.

    • Réservé.Reserved. Le bloc de mémoire est disponible pour votre utilisation et ne peut pas être utilisé pour une autre demande d'allocation.The block of memory is available for your use and cannot be used for any other allocation request. Toutefois, vous ne pouvez pas stocker de données dans ce bloc de mémoire tant qu'il n'est pas validé.However, you cannot store data to this memory block until it is committed.

    • Validé.Committed. Le bloc de mémoire est assigné au stockage physique.The block of memory is assigned to physical storage.

  • L'espace d'adressage virtuel peut être fragmenté.Virtual address space can get fragmented. Cela signifie qu'il existe des blocs libres, également appelés trous, dans l'espace d'adressage.This means that there are free blocks, also known as holes, in the address space. Lorsqu'une allocation de mémoire virtuelle est demandée, le gestionnaire de mémoire virtuelle doit rechercher un bloc unique libre suffisamment grand pour satisfaire la demande d'allocation.When a virtual memory allocation is requested, the virtual memory manager has to find a single free block that is large enough to satisfy that allocation request. Même si vous disposez de 2 Go d'espace libre, l'allocation qui requiert 2 Go échoue, sauf si tout cet espace libre est contenu dans un bloc d'adresse unique.Even if you have 2 GB of free space, the allocation that requires 2 GB will be unsuccessful unless all of that free space is in a single address block.

  • Vous pouvez manquer de mémoire si vous manquez d'espace d'adressage virtuel à réserver ou d'espace physique à valider.You can run out of memory if you run out of virtual address space to reserve or physical space to commit.

Votre fichier d'échange est utilisé, même si la sollicitation de la mémoire physique (c'est-à-dire, la demande de mémoire physique) est faible.Your page file is used even if physical memory pressure (that is, demand for physical memory) is low. La première fois que la sollicitation de la mémoire physique est élevée, le système d'exploitation doit libérer de la place dans la mémoire physique pour stocker des données et sauvegarde une partie des données qui sont dans la mémoire physique dans le fichier d'échange.The first time your physical memory pressure is high, the operating system must make room in physical memory to store data, and it backs up some of the data that is in physical memory to the page file. Ces données ne sont pas paginées tant qu'elles ne sont pas nécessaires, il est donc possible de rencontrer la pagination dans les situations dans lesquelles la sollicitation de la mémoire physique est très faible.That data is not paged until it is needed, so it is possible to encounter paging in situations where the physical memory pressure is very low.

Retour au débutBack to top

Conditions pour une opération garbage collectionConditions for a garbage collection

Le garbage collection se produit lorsque l'une des conditions suivantes est vraie :Garbage collection occurs when one of the following conditions is true:

  • Le système possède peu de mémoire physique.The system has low physical memory. Cette information nous est communiquée par la notification de mémoire insuffisante du système d’exploitation ou par un message similaire provenant de l’hôte.This is detected by either the low memory notification from the OS or low memory indicated by the host.

  • La mémoire utilisée par les objets alloués sur le tas managé dépasse un seuil acceptable.The memory that is used by allocated objects on the managed heap surpasses an acceptable threshold. Ce seuil est continuellement ajusté à mesure que le processus s'exécute.This threshold is continuously adjusted as the process runs.

  • La méthode GC.Collect est appelée.The GC.Collect method is called. Dans presque tous les cas, vous n'avez pas à appeler cette méthode, car le garbage collector s'exécute continuellement.In almost all cases, you do not have to call this method, because the garbage collector runs continuously. Cette méthode est principalement utilisée pour les situations uniques et les tests.This method is primarily used for unique situations and testing.

Retour au débutBack to top

Tas managéThe managed heap

Une fois que le garbage collector est initialisé par le CLR, il alloue un segment de mémoire pour stocker et gérer des objets.After the garbage collector is initialized by the CLR, it allocates a segment of memory to store and manage objects. Cette mémoire est appelée tas managé, par opposition à un tas natif dans le système d'exploitation.This memory is called the managed heap, as opposed to a native heap in the operating system.

Il existe un tas managé pour chaque processus managé.There is a managed heap for each managed process. Tous les threads du processus allouent de la mémoire pour les objets sur le même tas.All threads in the process allocate memory for objects on the same heap.

Pour réserver de la mémoire, le récupérateur de mémoire appelle la fonction Win32 VirtualAlloc et réserve un segment de mémoire à la fois pour les applications managées.To reserve memory, the garbage collector calls the Win32 VirtualAlloc function, and reserves one segment of memory at a time for managed applications. Le récupérateur de mémoire réserve également des segments si nécessaire, et libère des segments dans le système d’exploitation (après avoir effacé tous leurs objets) en appelant la fonction Win32 VirtualFree .The garbage collector also reserves segments as needed, and releases segments back to the operating system (after clearing them of any objects) by calling the Win32 VirtualFree function.

Important

La taille des segments alloués par le garbage collector est spécifique à l'implémentation et susceptible de changer à tout moment, y compris les mises à jour périodiques.The size of segments allocated by the garbage collector is implementation-specific and is subject to change at any time, including in periodic updates. Votre application ne doit jamais faire d'hypothèses concernant une taille de segment particulière, ni dépendre de celle-ci. Elle ne doit pas non plus tenter de configurer la quantité de mémoire disponible pour les allocations de segments.Your app should never make assumptions about or depend on a particular segment size, nor should it attempt to configure the amount of memory available for segment allocations.

Moins il y a d'objets alloués sur le tas, moins le garbage collector a à faire.The fewer objects allocated on the heap, the less work the garbage collector has to do. Lorsque vous allouez des objets, n'utilisez pas de valeurs arrondies qui dépassent vos besoins, par exemple en allouant un tableau de 32 octets lorsque vous avez besoin de seulement 15 octets.When you allocate objects, do not use rounded-up values that exceed your needs, such as allocating an array of 32 bytes when you need only 15 bytes.

Lorsqu'un garbage collection est déclenché, le garbage collector libère la mémoire occupée par les objets morts.When a garbage collection is triggered, the garbage collector reclaims the memory that is occupied by dead objects. Le processus de libération compacte les objets vivants afin qu'ils soient déplacés ensemble, et l'espace inutilisé est supprimé, ce qui entraîne la diminution du tas.The reclaiming process compacts live objects so that they are moved together, and the dead space is removed, thereby making the heap smaller. Les objets alloués ensemble restent ainsi ensemble sur le tas managé, pour conserver leur emplacement.This ensures that objects that are allocated together stay together on the managed heap, to preserve their locality.

Le déroulement (fréquence et durée) des garbage collection est le résultat du volume des allocations et de la quantité de mémoire restante sur le tas managé.The intrusiveness (frequency and duration) of garbage collections is the result of the volume of allocations and the amount of survived memory on the managed heap.

Le tas peut être considéré comme l’accumulation de deux tas : le tas de grands objets et le tas de petits objets.The heap can be considered as the accumulation of two heaps: the large object heap and the small object heap.

Le tas de grands objets contient des objets d’au moins 85 000 octets.The large object heap contains very large objects that are 85,000 bytes and larger. Ces objets du tas d'objets volumineux sont généralement des tableaux.The objects on the large object heap are usually arrays. Il est rare qu'un objet d'instance soit extrêmement grand.It is rare for an instance object to be extremely large.

Retour au débutBack to top

GénérationsGenerations

Le tas est organisé en générations. Il peut ainsi gérer des objets durables et éphémères.The heap is organized into generations so it can handle long-lived and short-lived objects. Le garbage collection consiste principalement en la récupération d'objets éphémères qui occupent généralement une petite partie du tas.Garbage collection primarily occurs with the reclamation of short-lived objects that typically occupy only a small part of the heap. Il existe trois générations d'objets sur le tas :There are three generations of objects on the heap:

  • Génération 0.Generation 0. Il s'agit de la génération la plus jeune, qui contient des objets éphémères.This is the youngest generation and contains short-lived objects. Un exemple d'objet éphémère est une variable temporaire.An example of a short-lived object is a temporary variable. Le garbage collection a le plus souvent lieu dans cette génération.Garbage collection occurs most frequently in this generation.

    Les objets alloués récemment forment une nouvelle génération d'objets et sont implicitement des collections de génération 0, à moins qu'ils ne s'agissent de grands objets, auquel cas ils entrent dans le tas d'objets volumineux dans une collection de génération 2.Newly allocated objects form a new generation of objects and are implicitly generation 0 collections, unless they are large objects, in which case they go on the large object heap in a generation 2 collection.

    La plupart des objets sont libérés pour l'opération garbage collection dans la génération 0 et ne survivent pas à la génération suivante.Most objects are reclaimed for garbage collection in generation 0 and do not survive to the next generation.

  • Génération 1.Generation 1. Cette génération contient des objets éphémères et sert de tampon entre objets éphémères et objets durables.This generation contains short-lived objects and serves as a buffer between short-lived objects and long-lived objects.

  • Génération 2.Generation 2. Cette génération contient des objets durables.This generation contains long-lived objects. Un exemple d'objet durable est un objet dans une application serveur qui contient des données statiques qui sont vivantes pour la durée du processus.An example of a long-lived object is an object in a server application that contains static data that is live for the duration of the process.

Les opérations garbage collection se produisent sur des générations spécifiques, selon les conditions spécifiées.Garbage collections occur on specific generations as conditions warrant. La collecte d'une génération signifie la collecte des objets de cette génération et de toutes ses générations plus jeunes.Collecting a generation means collecting objects in that generation and all its younger generations. Les opérations garbage collection de génération 2 sont également appelées garbage collection complet, car elles libèrent tous les objets de toutes les générations (autrement dit, tous les objets du tas managé).A generation 2 garbage collection is also known as a full garbage collection, because it reclaims all objects in all generations (that is, all objects in the managed heap).

Survie et promotionsSurvival and promotions

Les objets qui ne sont pas libérés dans un garbage collection sont appelé survivants et sont promus à la génération suivante.Objects that are not reclaimed in a garbage collection are known as survivors, and are promoted to the next generation. Les objets qui survivent à un garbage collection de génération 0 sont promus à la génération 1, les objets qui survivent à un garbage collection de génération 1 sont promus à la génération 2 et les objets qui survivent à un garbage collection de génération 2 restent dans la génération 2.Objects that survive a generation 0 garbage collection are promoted to generation 1; objects that survive a generation 1 garbage collection are promoted to generation 2; and objects that survive a generation 2 garbage collection remain in generation 2.

Lorsque le garbage collector détecte que le taux de survie est élevé dans une génération, il augmente le seuil des allocations de cette génération. La collecte suivante récupère donc une taille substantielle de mémoire libérée.When the garbage collector detects that the survival rate is high in a generation, it increases the threshold of allocations for that generation, so the next collection gets a substantial size of reclaimed memory. Le CLR équilibre continuellement deux priorités : ne pas permettre au jeu de travail d'une application de devenir trop grand et ne pas permettre pas au garbage collection d'être trop long.The CLR continually balances two priorities: not letting an application's working set get too big and not letting the garbage collection take too much time.

Segments et générations éphémèresEphemeral generations and segments

Étant donné que les objets des générations 0 et 1 sont éphémères, ces générations sont appelées générations éphémères.Because objects in generations 0 and 1 are short-lived, these generations are known as the ephemeral generations.

Les générations éphémères doivent être allouées dans le segment de mémoire appelé segment éphémère.Ephemeral generations must be allocated in the memory segment that is known as the ephemeral segment. Chaque nouveau segment acquis par le garbage collector devient le nouveau segment éphémère et contient les objets qui ont survécu à un garbage collection de génération 0.Each new segment acquired by the garbage collector becomes the new ephemeral segment and contains the objects that survived a generation 0 garbage collection. L'ancien segment éphémère devient le nouveau segment de génération 2.The old ephemeral segment becomes the new generation 2 segment.

La taille du segment éphémère peut varier selon que le système est 32 ou 64 bits. Elle peut également varier en fonction du type de garbage collector exécuté.The size of the ephemeral segment varies depending on whether a system is 32- or 64-bit, and on the type of garbage collector it is running. Le tableau ci-dessous répertorie les valeurs par défaut.Default values are shown in the following table.

32 bits32-bit 64 bits64-bit
Garbage collector pour station de travailWorkstation GC 16 Mo16 MB 256 Mo256 MB
Garbage collector pour serveurServer GC 64 Mo64 MB 4 Go4 GB
Garbage collector pour serveur > 4 processeurs logiquesServer GC with > 4 logical CPUs 32 Mo32 MB 2 Go2 GB
Garbage collector pour serveur > 8 processeurs logiquesServer GC with > 8 logical CPUs 16 Mo16 MB 1 Go1 GB

Le segment éphémère peut inclure des objets de la génération 2.The ephemeral segment can include generation 2 objects. Les objets de génération 2 peuvent utiliser plusieurs segments (autant que votre processus en requiert et que la mémoire en autorise).Generation 2 objects can use multiple segments (as many as your process requires and memory allows for).

La quantité de mémoire libérée à partir d'un garbage collection éphémère est limitée à la taille du segment éphémère.The amount of freed memory from an ephemeral garbage collection is limited to the size of the ephemeral segment. La quantité de mémoire libérée est proportionnelle à l'espace occupé par les objets morts.The amount of memory that is freed is proportional to the space that was occupied by the dead objects.

Retour au débutBack to top

Déroulement d'une opération garbage collectionWhat happens during a garbage collection

Une opération garbage collection présente les phases suivantes :A garbage collection has the following phases:

  • Une phase de marquage qui recherche et crée une liste de tous les objets actifs.A marking phase that finds and creates a list of all live objects.

  • Une phase de déplacement qui met à jour les références aux objets qui seront compactés.A relocating phase that updates the references to the objects that will be compacted.

  • Une phase de compactage qui libère l'espace occupé par les objets morts et compacte les objets survivants.A compacting phase that reclaims the space occupied by the dead objects and compacts the surviving objects. La phase de compactage déplace les objets qui ont survécu à un garbage collection vers l'extrémité la plus ancienne du segment.The compacting phase moves objects that have survived a garbage collection toward the older end of the segment.

    Étant donné que les collections de génération 2 peuvent occuper plusieurs segments, les objets promus dans la génération 2 peuvent être déplacés dans un segment plus ancien.Because generation 2 collections can occupy multiple segments, objects that are promoted into generation 2 can be moved into an older segment. Les survivants des générations 1 et 2 peuvent être déplacés vers un autre segment, car ils sont promus à la génération 2.Both generation 1 and generation 2 survivors can be moved to a different segment, because they are promoted to generation 2.

    Normalement, le tas d'objets volumineux n'est pas compacté, car la copie d'objets volumineux implique une diminution des performances.Ordinarily, the large object heap is not compacted, because copying large objects imposes a performance penalty. Toutefois, à partir de .NET Framework 4.5.1, vous pouvez utiliser la propriété GCSettings.LargeObjectHeapCompactionMode pour compacter le tas d’objets volumineux à la demande.However, starting with the .NET Framework 4.5.1, you can use the GCSettings.LargeObjectHeapCompactionMode property to compact the large object heap on demand.

Le garbage collector utilise les informations suivantes pour déterminer si les objets sont vivants :The garbage collector uses the following information to determine whether objects are live:

  • Racines de pile.Stack roots. Variables de pile fournies par le compilateur juste-à-temps (JIT) et l'explorateur de pile.Stack variables provided by the just-in-time (JIT) compiler and stack walker. Notez que les optimisations JIT peuvent allonger ou raccourcir les régions de code dans lesquelles les variables de pile sont signalées au garbage collector.Note that JIT optimizations can lengthen or shorten regions of code within which stack variables are reported to the garbage collector.

  • Handles de garbage collection.Garbage collection handles. Handles qui pointent vers les objets managés qui peuvent être alloués par le code utilisateur ou par le Common Language Runtime.Handles that point to managed objects and that can be allocated by user code or by the common language runtime.

  • Données statiques.Static data. Objets statiques des domaines d'application qui pourraient référencer d'autres objets.Static objects in application domains that could be referencing other objects. Chaque domaine d'application effectue le suivi de ses objets statiques.Each application domain keeps track of its static objects.

Avant qu'une opération garbage collection ne démarre, tous les threads managés sont suspendus à l'exception du thread qui a déclenché l'opération.Before a garbage collection starts, all managed threads are suspended except for the thread that triggered the garbage collection.

L'illustration suivante montre un thread qui déclenche un garbage collection et entraîne l'interruption des autres threads.The following illustration shows a thread that triggers a garbage collection and causes the other threads to be suspended.

Lorsqu’un thread déclenche un garbage collectionWhen a thread triggers a Garbage Collection
Thread qui déclenche un garbage collectionThread that triggers a garbage collection

Retour au débutBack to top

Manipulation des ressources non managéesManipulating unmanaged resources

Si vos objets managés référencent des objets non managés à l'aide de leurs handles de fichiers natifs, vous devez libérer explicitement les objets non managés, car le garbage collector effectue le suivi de la mémoire uniquement sur le tas managé.If your managed objects reference unmanaged objects by using their native file handles, you have to explicitly free the unmanaged objects, because the garbage collector tracks memory only on the managed heap.

Les utilisateurs de votre objet managé ne peuvent pas supprimer les ressources natives utilisées par l'objet.Users of your managed object may not dispose the native resources used by the object. Pour effectuer le nettoyage, vous pouvez rendre votre objet managé finalisable.To perform the cleanup, you can make your managed object finalizable. La finalisation est constituée des actions de nettoyage que vous exécutez lorsque l'objet n'est plus utilisé.Finalization consists of cleanup actions that you execute when the object is no longer in use. Lorsque votre objet managé meurt, il effectue les actions de nettoyage spécifiées dans sa méthode de finaliseur.When your managed object dies, it performs cleanup actions that are specified in its finalizer method.

Lorsqu'un objet finalisable est détecté comme étant mort, son finaliseur est placé dans une file d'attente afin que ses actions de nettoyage soient exécutées, mais l'objet lui-même est promu à la génération suivante.When a finalizable object is discovered to be dead, its finalizer is put in a queue so that its cleanup actions are executed, but the object itself is promoted to the next generation. Par conséquent, vous devez attendre jusqu'au garbage collection suivant sur cette génération (qui n'est pas nécessairement le garbage collection suivant) pour déterminer si l'objet a été récupéré.Therefore, you have to wait until the next garbage collection that occurs on that generation (which is not necessarily the next garbage collection) to determine whether the object has been reclaimed.

Retour au débutBack to top

Garbage collection de station de travail et de serveurWorkstation and server garbage collection

Le garbage collector s'ajuste automatiquement et peut travailler dans une large gamme de scénarios.The garbage collector is self-tuning and can work in a wide variety of scenarios. Vous pouvez utiliser un paramètre du fichier de configuration pour définir le type de garbage collection en fonction des caractéristiques de la charge de travail.You can use a configuration file setting to set the type of garbage collection based on the characteristics of the workload. Le CLR fournit les types de garbage collection suivants :The CLR provides the following types of garbage collection:

  • Garbage collection de station de travail, pour toutes les stations de travail clientes et les PC autonomes.Workstation garbage collection, which is for all client workstations and stand-alone PCs. Il s'agit du paramètre par défaut de l'<élément dans le schéma de configuration d'exécution.This is the default setting for the <gcServer> element in the runtime configuration schema.

    Le garbage collection de station de travail peut être simultané ou non simultané.Workstation garbage collection can be concurrent or non-concurrent. Le garbage collection simultané permet aux threads managés de continuer à fonctionner pendant un garbage collection.Concurrent garbage collection enables managed threads to continue operations during a garbage collection.

    À compter de .NET Framework 4, le garbage collection d’arrière-plan remplace le garbage collection simultané.Starting with the .NET Framework 4, background garbage collection replaces concurrent garbage collection.

  • Garbage collection de serveur, prévu pour les applications serveur qui ont besoin d'un débit et d'une extensibilité.Server garbage collection, which is intended for server applications that need high throughput and scalability. Le garbage collection de serveur peut être non simultané ou en arrière-plan.Server garbage collection can be non-concurrent or background.

Les illustrations suivantes montrent les threads dédiés qui exécutent un garbage collection sur un serveur.The following illustration shows the dedicated threads that perform the garbage collection on a server.

Threads de garbage collection du serveurServer Garbage Collection Threads
Garbage collection de serveurServer garbage collection

Configuration du garbage collectionConfiguring garbage collection

Vous pouvez utiliser l’<élément du schéma de configuration d’exécution pour spécifier le type de garbage collection que vous souhaitez que le CLR exécute.You can use the <gcServer> element of the runtime configuration schema to specify the type of garbage collection you want the CLR to perform. Lorsque l'attribut enabled de cet élément a la valeur false (valeur par défaut), le CLR exécute le garbage collection de station de travail.When this element's enabled attribute is set to false (the default), the CLR performs workstation garbage collection. Lorsque vous affectez à l'attribut enabled la valeur true, le CLR exécute le garbage collection de serveur.When you set the enabled attribute to true, the CLR performs server garbage collection.

Le garbage collection simultané est spécifié avec l<’élément du schéma de configuration d’exécution.Concurrent garbage collection is specified with the <gcConcurrent> element of the runtime configuration schema. Le paramètre par défaut est enabled.The default setting is enabled. Ce paramètre contrôle à la fois le garbage collection en cours et celui d'arrière-plan.This setting controls both concurrent and background garbage collection.

Vous pouvez également spécifier le garbage collection de serveur avec des interfaces d'hébergement non managées.You can also specify server garbage collection with unmanaged hosting interfaces. Notez que ASP.NET et SQL Server activent automatiquement le garbage collection de serveur si votre application est hébergée dans un de ces environnements.Note that ASP.NET and SQL Server enable server garbage collection automatically if your application is hosted inside one of these environments.

Comparaison des opérations garbage collection de station de travail et de serveurComparing workstation and server garbage collection

Voici les considérations liées aux threads et aux performances pour le garbage collection de station de travail :The following are threading and performance considerations for workstation garbage collection:

  • La collecte se produit sur le thread utilisateur qui a déclenché le garbage collection et reste à la même priorité.The collection occurs on the user thread that triggered the garbage collection and remains at the same priority. Étant donné que les threads utilisateur sont généralement exécutés à la priorité normale, le garbage collector (qui s'exécute sur un thread de priorité normale) doit rivaliser avec d'autres threads pour le temps processeur.Because user threads typically run at normal priority, the garbage collector (which runs on a normal priority thread) must compete with other threads for CPU time.

    Les threads qui exécutent du code natif ne sont pas interrompus.Threads that are running native code are not suspended.

  • Le garbage collection de station de travail est toujours utilisé sur un ordinateur doté d’un seul processeur, indépendamment du paramètre <.Workstation garbage collection is always used on a computer that has only one processor, regardless of the <gcServer> setting. Si vous spécifiez le garbage collection de serveur, le CLR utilise le garbage collection de station de travail avec la concurrence désactivée.If you specify server garbage collection, the CLR uses workstation garbage collection with concurrency disabled.

Voici les considérations liées aux threads et aux performances pour le garbage collection de serveur :The following are threading and performance considerations for server garbage collection:

  • La collecte se produit sur plusieurs threads dédiés qui s'exécutent au niveau de priorité THREAD_PRIORITY_HIGHEST .The collection occurs on multiple dedicated threads that are running at THREAD_PRIORITY_HIGHEST priority level.

  • Un tas et un thread dédié pour effectuer le garbage collection sont fournis pour chaque UC, et les tas sont collectés au même moment.A heap and a dedicated thread to perform garbage collection are provided for each CPU, and the heaps are collected at the same time. Chaque tas contient un tas de petits objets et un tas d'objets volumineux, et tous les tas peuvent faire l'objet d'accès par du code utilisateur.Each heap contains a small object heap and a large object heap, and all heaps can be accessed by user code. Les objets des différents tas peuvent faire référence les uns aux autres.Objects on different heaps can refer to each other.

  • Étant donné que plusieurs threads de garbage collection fonctionnent ensemble, le garbage collection de serveur est plus rapide que le garbage collection de station de travail sur un tas de même taille.Because multiple garbage collection threads work together, server garbage collection is faster than workstation garbage collection on the same size heap.

  • Le garbage collection de serveur présente souvent des segments de plus grande taille.Server garbage collection often has larger size segments. Notez, cependant, qu'il ne s'agit que d'une généralisation : la taille de segment est spécifique à l'implémentation et est susceptible de changer.Note, however, that this is only a generalization: segment size is implementation-specific and is subject to change. Vous ne devez pas faire d'hypothèses sur la taille des segments alloués par le garbage collector lors du paramétrage de votre application.You should make no assumptions about the size of segments allocated by the garbage collector when tuning your app.

  • Le garbage collection de serveur peut consommer beaucoup de ressources.Server garbage collection can be resource-intensive. Par exemple, si vous disposez de 12 processus qui s'exécutent sur un ordinateur possédant 4 processeurs, il y aura 48 threads de garbage collection dédiés s'ils utilisent tous le garbage collection de serveur.For example, if you have 12 processes running on a computer that has 4 processors, there will be 48 dedicated garbage collection threads if they are all using server garbage collection. Dans une situation de charge de mémoire élevée, si tous les processus commencent le garbage collection, le garbage collector aura 48 threads à planifier.In a high memory load situation, if all the processes start doing garbage collection, the garbage collector will have 48 threads to schedule.

Si vous exécutez des centaines d'instances d'une application, envisagez d'utiliser le garbage collection de station de travail avec le garbage collection simultané désactivé.If you are running hundreds of instances of an application, consider using workstation garbage collection with concurrent garbage collection disabled. Cela provoquera moins de changements de contexte, ce qui peut améliorer les performances.This will result in less context switching, which can improve performance.

Retour au débutBack to top

Garbage collection simultanéConcurrent garbage collection

Avec le garbage collection de station de travail ou de serveur, vous pouvez activer un garbage collection simultané, ce qui permet aux threads de fonctionner simultanément avec un thread dédié qui exécute le garbage collection pendant une grande partie de la durée de ce dernier.In workstation or server garbage collection, you can enable concurrent garbage collection, which enables threads to run concurrently with a dedicated thread that performs the garbage collection for most of the duration of the collection. Cette option affecte uniquement les opérations garbage collection de génération 2. Les générations 0 et 1 sont toujours non simultanées car elles se terminent très rapidement.This option affects only garbage collections in generation 2; generations 0 and 1 are always non-concurrent because they finish very fast.

Le garbage collection simultané permet aux applications interactives d'être plus réactives en réduisant les pauses d'une collection.Concurrent garbage collection enables interactive applications to be more responsive by minimizing pauses for a collection. Les threads managés peuvent continuer à s'exécuter une grande partie de la durée du garbage collection simultané.Managed threads can continue to run most of the time while the concurrent garbage collection thread is running. Cela génère des pauses plus courtes pendant l'opération garbage collection.This results in shorter pauses while a garbage collection is occurring.

Pour améliorer les performances lorsque plusieurs processus s'exécutent, désactivez le garbage collection simultané.To improve performance when several processes are running, disable concurrent garbage collection. Pour cela, vous pouvez ajouter un <élément dans le fichier de configuration de l’application et définir son attribut enabled à la valeur "false".You can do this by adding a <gcConcurrent> element to the app's configuration file and setting the value of its enabled attribute to "false".

Le garbage collection simultané est exécuté sur un thread dédié.Concurrent garbage collection is performed on a dedicated thread. Par défaut, le CLR effectue le garbage collection de station de travail avec le garbage collection simultané activé.By default, the CLR runs workstation garbage collection with concurrent garbage collection enabled. Ceci est vrai pour les ordinateurs multiprocesseur et à processeur unique.This is true for single-processor and multi-processor computers.

Votre capacité à allouer de petits objets sur le tas pendant un garbage collection simultané est limitée par les objets restants dans le segment éphémère lorsqu'une opération garbage collection simultanée démarre.Your ability to allocate small objects on the heap during a concurrent garbage collection is limited by the objects left on the ephemeral segment when a concurrent garbage collection starts. Dès que vous atteignez la fin du segment, vous devez attendre que le garbage collection simultané se termine pendant que les threads managés qui doivent effectuer les allocations des petits objet sont interrompus.As soon as you reach the end of the segment, you will have to wait for the concurrent garbage collection to finish while managed threads that have to make small object allocations are suspended.

Le garbage collection simultané possède un jeu de travail légèrement plus grand (comparé au garbage collection non simultané) car vous pouvez allouer des objets pendant la collecte simultanée.Concurrent garbage collection has a slightly bigger working set (compared with non-concurrent garbage collection), because you can allocate objects during concurrent collection. Toutefois, cela peut affecter les performances, car les objets que vous allouez deviennent une partie de votre jeu de travail.However, this can affect performance, because the objects that you allocate become part of your working set. Essentiellement, le garbage collection simultané échange de l'UC et de la mémoire contre des pauses plus courtes.Essentially, concurrent garbage collection trades some CPU and memory for shorter pauses.

L'illustration suivante montre le garbage collection simultané exécuté sur un thread dédié différent.The following illustration shows concurrent garbage collection performed on a separate dedicated thread.

Threads de garbage collection simultanésConcurrent Garbage Collection Threads
Garbage collection simultanéConcurrent garbage collection

Retour au débutBack to top

Nettoyage de la mémoire de la station de travail en arrière-planBackground workstation garbage collection

Avec le garbage collection d'arrière-plan, les générations éphémères (0 et 1) sont collectées si nécessaire pendant la collecte de la génération 2.In background garbage collection, ephemeral generations (0 and 1) are collected as needed while the collection of generation 2 is in progress. Il n'y a aucun paramètre pour le garbage collection d'arrière-plan. Il est automatiquement activé avec le garbage collection simultané.There is no setting for background garbage collection; it is automatically enabled with concurrent garbage collection. Le garbage collection d'arrière-plan vient en remplacement du garbage collection simultané.Background garbage collection is a replacement for concurrent garbage collection. Comme le garbage collection simultané, le garbage collection d'arrière-plan est exécuté sur un thread dédié et est uniquement applicable aux collections de génération 2.As with concurrent garbage collection, background garbage collection is performed on a dedicated thread and is applicable only to generation 2 collections.

Notes

Le garbage collection d’arrière-plan est uniquement disponible dans .NET Framework 4 et versions ultérieures.Background garbage collection is available only in the .NET Framework 4 and later versions. Dans .NET Framework 4, il est pris en charge uniquement pour le garbage collection de station de travail.In the .NET Framework 4, it is supported only for workstation garbage collection. Depuis .NET Framework 4.5, le garbage collection en arrière-plan est disponible pour les deux opérations garbage collection de station de travail et de serveur.Starting with the .NET Framework 4.5, background garbage collection is available for both workstation and server garbage collection.

Une collecte sur des générations éphémères pendant le garbage collection d'arrière-plan est appelée garbage collection de premier plan.A collection on ephemeral generations during background garbage collection is known as foreground garbage collection. Lorsque des opérations garbage collection de premier plan ont lieu, tous les threads managés sont suspendus.When foreground garbage collections occur, all managed threads are suspended.

Lorsque le garbage collection d'arrière-plan est en cours et que vous avez alloué assez d'objets dans la génération 0, le CLR exécute un garbage collection de premier plan de génération 0 ou 1.When background garbage collection is in progress and you have allocated enough objects in generation 0, the CLR performs a generation 0 or generation 1 foreground garbage collection. Le thread de garbage collection d'arrière-plan dédié vérifie des points sécurisés fréquents de façon à déterminer s'il existe une demande de garbage collection de premier plan.The dedicated background garbage collection thread checks at frequent safe points to determine whether there is a request for foreground garbage collection. Le cas échéant, la collecte d'arrière-plan s'interrompt afin que le garbage collection de premier plan puisse se produire.If there is, the background collection suspends itself so that foreground garbage collection can occur. Une fois le garbage collection de premier plan terminé, le thread de garbage collection d'arrière-plan dédié et les threads utilisateur reprennent.After the foreground garbage collection is completed, the dedicated background garbage collection thread and user threads resume.

Le garbage collection d'arrière-plan supprime les restrictions d'allocation imposées par le garbage collection simultané, car des opérations garbage collection éphémères peuvent se produire pendant le garbage collection d'arrière-plan.Background garbage collection removes allocation restrictions imposed by concurrent garbage collection, because ephemeral garbage collections can occur during background garbage collection. Cela signifie que le garbage collection d'arrière-plan peut supprimer des objets morts dans les générations éphémères et peut également développer le tas si nécessaire pendant un garbage collection de génération 1.This means that background garbage collection can remove dead objects in ephemeral generations and can also expand the heap if needed during a generation 1 garbage collection.

L’illustration suivante montre le nettoyage de la mémoire en arrière-plan effectué sur un thread dédié distinct, sur une station de travail :The following illustration shows background garbage collection performed on a separate dedicated thread on a workstation:

Diagramme illustrant le nettoyage de la mémoire d’une station de travail en arrière-plan.

Retour au débutBack to top

Nettoyage de la mémoire du serveur en arrière-planBackground server garbage collection

Depuis .NET Framework 4.5, le garbage collection de serveur en arrière-plan est le mode par défaut pour le garbage collection de serveur.Starting with the .NET Framework 4.5, background server garbage collection is the default mode for server garbage collection. Pour choisir ce mode, affectez à l'attribut enabled de l'<élément la valeur true dans le schéma de configuration d'exécution.To choose this mode, set the enabled attribute of the <gcServer> element to true in the runtime configuration schema. Ce mode fonctionne de la même façon que le garbage collection de station de travail en arrière-plan, décrit dans la section précédente, mais il existe quelques différences.This mode functions similarly to background workstation garbage collection, described in the previous section, but there are a few differences. Le garbage collection de station de travail en arrière-plan utilise un thread de garbage collection en arrière-plan dédié, tandis que le garbage collection de serveur en arrière-plan utilise plusieurs threads : généralement un thread dédié pour chaque processeur logique.Background workstation garbage collection uses one dedicated background garbage collection thread, whereas background server garbage collection uses multiple threads, typically a dedicated thread for each logical processor. Contrairement au thread du garbage collection de station de travail en arrière-plan, ces threads n'expirent pas.Unlike the workstation background garbage collection thread, these threads do not time out.

L’illustration suivante montre le nettoyage de la mémoire en arrière-plan effectué sur un thread dédié distinct, sur un serveur :The following illustration shows background garbage collection performed on a separate dedicated thread on a server:

Diagramme illustrant le nettoyage de la mémoire d’un serveur en arrière-plan.

Voir aussiSee also