Table des matières
2. Le tas: mémoire dynamique pour les types de référence
3. Collection des ordures: nettoyage automatique de la mémoire
Comment fonctionne GC
Qu'est-ce qui déclenche GC?
Remarques importantes:
Maison développement back-end Tutoriel C#.Net Gestion de la mémoire dans .NET: Comprendre la pile, le tas et GC

Gestion de la mémoire dans .NET: Comprendre la pile, le tas et GC

Aug 27, 2025 am 06:25 AM

La pile stocke les types de valeurs et les références avec une affaire rapide et automatique; Le tas contient les objets de type de référence dynamiquement; et le collecteur de déchets récupére des objets de tas inaccessibles. 1. La pile est spécifique au thread, en taille limitée, et stocke les variables locales, les paramètres de méthode et les références - le mémoire est libéré lorsque les méthodes sortent. 2. Le tas est partagé sur les fils, se développe dynamiquement et stocke des objets comme les classes, les tableaux et les chaînes - l'allocation est plus lente et le nettoyage est géré par le GC. 3. Le GC récupére la mémoire utilisant la collection générationnelle (Gen 0, 1, 2), fonctionne sous pression de mémoire ou contraintes du système, et utilise la marque et la compact pour réduire la fragmentation, tandis que les finalisateurs retardnt le nettoyage et iDisposable garantit une libération rapide des ressources non gérées. La compréhension de ces mécanismes permet une utilisation efficace de la mémoire, réduit la pression GC et améliore les performances de l'application dans .NET.

Gestion de la mémoire dans .NET: Comprendre la pile, le tas et GC

Lorsque vous travaillez avec .NET, comprendre comment la mémoire est gérée est crucial pour écrire des applications efficaces et performantes. Au cœur de ce système se trouvent trois concepts clés: la pile , le tas et le collecteur des ordures (GC) . Chacun joue un rôle distinct dans la façon dont les objets et les variables sont stockés, accessibles et nettoyés.

Décomposons la façon dont ils travaillent ensemble et ce que vous devez savoir en tant que développeur.


1. La pile: stockage rapide et fixe pour les types de valeur et références

La pile est une région de mémoire qui stocke les types de valeur (comme int , bool , struct ) et références aux objets sur le tas (pas les objets eux-mêmes). Il fonctionne de manière dernière (LIFO), ce qui signifie que l'article le plus récemment alloué est le premier à être libéré.

Que se passe-t-il sur la pile?

  • Variables locales de types de valeur
  • Paramètres de la méthode
  • Adresses de retour (afin que le programme sache où aller après une méthode terminée)
  • Références aux objets (pointeurs vers des objets alloués au tas)

Caractéristiques clés:

  • Attribution rapide et affaire - Déplacement d'un pointeur de pile
  • La mémoire est automatiquement récupérée lorsqu'une méthode sort
  • La taille est limitée - généralement quelques mégaoctets par fil
  • Spécifique au fil - chaque fil a sa propre pile

Par exemple:

 void MyMethod ()
{
    int x = 5; // Type de valeur → stocké sur la pile
    String S = "Hello"; // 's' est une référence → stockée sur la pile; L'objet "bonjour" est sur le tas
}

Lorsque MyMethod se termine, x et les s sont supprimées de la pile. L'objet de chaîne réel peut rester sur le tas jusqu'à ce que le GC le nettoie - s'il n'est plus référencé.


2. Le tas: mémoire dynamique pour les types de référence

Le tas est l'endroit où les types de référence (comme class , string , array , delegate ) sont stockés. Contrairement à la pile, le tas est géré plus librement et permet une allocation dynamique d'objets de tailles variables.

Qu'est-ce qui se passe sur le tas?

  • Objets créés à partir de classes
  • Tableaux
  • Cordes
  • Fermetures et délégués

Caractéristiques clés:

  • Allocation plus lente en raison de la gestion de la mémoire plus complexe
  • Pas de nettoyage automatique - repose sur le collecteur des ordures
  • Partagé sur les fils
  • Se développe dynamiquement au besoin

Exemple:

 Personne p = new personne ();

Ici, la variable p (une référence) est stockée sur la pile, mais l'objet Person réel est créé sur le tas.

Étant donné que la mémoire du tas n'est pas automatiquement libérée lorsqu'une méthode se termine, .NET a besoin d'un moyen de récupérer des objets inutilisés - c'est là que le collecteur des ordures entre en jeu.


3. Collection des ordures: nettoyage automatique de la mémoire

Le collecteur des ordures (GC) est responsable de la récupération de la mémoire occupée par des objets qui ne sont plus accessibles. Il s'exécute automatiquement et aide à prévenir les fuites de mémoire et les erreurs de gestion de la mémoire manuelle.

Comment fonctionne GC

Le GC utilise un algorithme de marque et de compact (avec des variations en fonction de la génération) et fonctionne en générations:

  • Génération 0 : Nouveaux objets. Collecté fréquemment.
  • Génération 1 : objets qui ont survécu à une collection Gen 0.
  • Génération 2 : objets à longue durée de vie. Collecté moins souvent.

Lorsque GC fonctionne:

  1. Il identifie les objets accessibles (ceux toujours référencés par le code).
  2. Les objets inaccessibles sont marqués pour la suppression.
  3. La mémoire est compactée pour réduire la fragmentation.
  4. Les références sont mises à jour pour pointer vers de nouveaux emplacements après le compactage.

Qu'est-ce qui déclenche GC?

  • Pression de la mémoire du tas (trop d'allocations dans la génération 0)
  • Appel explicite à GC.Collect() (non recommandé dans les scénarios normaux)
  • Contraintes de ressources système

Remarques importantes:

  • Les finalisateurs (destructeurs en C #) retardent le nettoyage GC car les objets avec finalisateurs vont dans une file d'attente de finalisation et nécessitent un cycle supplémentaire.
  • Utilisez IDisposable et l'instruction using pour le nettoyage déterministe des ressources non gérées (fichiers, connexions de base de données, etc.).

Exemple:

 Utilisation (var file = file.open ("data.txt", fileMode.open))
{
    // Le fichier est éliminé automatiquement à la fin du bloc
}

Cela garantit une libération rapide de ressources non gérées, même si l'objet de wrapper géré sera toujours nettoyé par GC plus tard.


Pile vs tas: une comparaison rapide

Fonctionnalité Empiler Tas
Vitesse d'allocation Très rapide Ralentissez
Élocution Automatique (à la sortie de la méthode) Géré par GC
Limite de taille Petit (par fil) Grand, grandit dynamiquement
Données stockées Types de valeur, références Objets de type de référence
Accès au fil Filial Partagé sur les fils
Gestion de la mémoire Manuel (par CPU / Runtime) Automatique (GC)

Meilleures pratiques pour l'efficacité de la mémoire

  • Préférez les types de valeur pour les petites données à courte durée de vie (mais évitez la surutilisation des structures avec de grandes données).
  • Évitez les allocations d'objets inutiles en boucles.
  • Réutilisez les objets dans la mesure du possible (par exemple, en utilisant des pools d'objets pour les allocations à haute fréquence).
  • Disposer des ressources mettant en œuvre IDisposable .
  • Ne forcez pas GC.Collect () sauf dans des scénarios très spécifiques (par exemple, après un grand traitement de données).
  • Surveillez l'utilisation de la mémoire avec des outils tels que Visual Studio Diagnostics, DotMemory ou PerfView.

Comprendre comment la pile, le tas et le GC interagissent vous aident à écrire un meilleur code .NET - éviter les fuites de mémoire, réduire la pression GC et améliorer les performances. Alors que .NET résume une grande partie de la complexité, savoir ce qui se passe sous le capot fait de vous un développeur plus efficace.

Fondamentalement, la pile gère les trucs rapides et temporaires; Le tas contient les objets à long terme; Et le GC garde le tas propre. Gardez cela à l'esprit et vous êtes en avance sur le jeu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT

Stock Market GPT

Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Optimisation du temps de démarrage de l'application C # avec ReadyTorun et compilation AOT Optimisation du temps de démarrage de l'application C # avec ReadyTorun et compilation AOT Aug 22, 2025 am 07:46 AM

Readytorun (R2R) ImprovesstartupTimeBypre-CompilingilTonativecoceDuringPublish, réduisant jitworkloadatruntime.2.NativEAotcompilationEliminatesthhejitentilyByPiling TheenTireApptonatiVEcodeatBuildtime, permitNear-InStarTup.3.User2Rformalimal-Effo.

Gestion de la mémoire dans .NET: Comprendre la pile, le tas et GC Gestion de la mémoire dans .NET: Comprendre la pile, le tas et GC Aug 27, 2025 am 06:25 AM

ThestackStoresvaluTypeSEAndreferences withfast, AutomaticDealLocation; theheapholdSreferenceTypeObjectSDynamiquement; et ThegarBageColElCORCLAMMERSUMSURACHABLABLYHEAPOBJECTS.1.ThestackisThread-Specific, LimitedInsize, andstoreSLocalvariables, MethoardParameters, An an

API minimales dans ASP.NET Core 8: une plongée profonde pratique API minimales dans ASP.NET Core 8: une plongée profonde pratique Aug 22, 2025 pm 12:50 PM

Minimalapisin.net8AreAproduction prêt pour la performance High-PerforceNternativeToControllers, IdealformOdernBackends.1.structurereal-worldapisusUnDendpointGroupSAntendExtensionMethodstoEprogram.csclean.2.LefiltfulldependencyInjectionSupportInServiceSDIR

Framework Core Performance Tuning: meilleures pratiques pour les requêtes plus rapides Framework Core Performance Tuning: meilleures pratiques pour les requêtes plus rapides Sep 01, 2025 am 08:50 AM

UsEasnotracking () Forread-OnlyquestoreduceMemoryAnd ImprovePerformance; 2.SelectOnlyNeedDataviaprojectionIntodTosoranonyMoustypestomimizedatatransfer; 3.Preventn 1QueriesByusinginclude (), ThenLinclude (), Orsplitqueries; 4.PreferexpLlicjoineSovern

Comment utiliser Dictionary  en C # efficacement? Comment utiliser Dictionary en C # efficacement? Aug 31, 2025 am 08:24 AM

Usagedictionaryforfasto (1) Key-basasedlopwupswhenstoricaluquekey-valueprairs lidtoobject; éviter la commande dedataornon-uniquekeys.prefertrrygetvaluetosafelyretReveValues ​​withoutExceptions.UsestringorvaluetypeaSkeys, ainsi

C # Générateurs source: un guide pratique de la métaprogrammation C # Générateurs source: un guide pratique de la métaprogrammation Aug 15, 2025 am 05:45 AM

SourceGenerators peut générer automatiquement du code au moment de la compilation, réduire le code en double et améliorer les performances; 1. Il analyse l'arborescence de syntaxe et génère de nouveaux fichiers pendant la compilation en implémentant l'interface IsourceGenerator; 2. Il ne peut pas modifier le code d'origine et ne peut ajouter que de nouveaux types tels que l'inotifyPropertyChanged implémentation; 3. Il doit créer des références de projet indépendantes et définir Private = false pour activer le générateur; 4. Les avantages sont des frais généraux nuls et une sécurité forte, et les inconvénients sont difficiles à déboguer et à maîtriser Roslynapi; Cette technologie convient à des scénarios tels que la notification automatique des propriétés, la sérialisation, la mise en œuvre de l'interface, etc., et est un outil important pour la métaprogrammation C # moderne.

C # Injection de dépendance: des bases aux scénarios avancés avec des conteneurs DI C # Injection de dépendance: des bases aux scénarios avancés avec des conteneurs DI Aug 16, 2025 am 01:41 AM

DependencyInjection (DI) Inc # IsadesignPatterNThaTenablesLooseCouplingByInjectring Dispensecs axternallyratherthancreatingtheminnally.1.Dipromotestability andmaintypainity, asseenwenreplacingTightlyCouledDependcents (par exemple, newlogger ()) avec la consistruc.

Quelle est la fonctionnalité Global Utilisation en C # 10? Quelle est la fonctionnalité Global Utilisation en C # 10? Aug 30, 2025 am 02:32 AM

La fonction d'utilisation globale permet la déclaration d'utilisation des instructions une fois en C # 10, ce qui les rend automatiquement disponibles dans tous les fichiers du projet, réduisant le code en double et améliorant la lisibilité.

See all articles