Gestion de la Memoire en .
NET / CLR
CLR • Managed Heap • Stack • Garbage Collector • Value vs Reference Types
.NET 8 LTS — Reference Sheet
1. CLR et Memoire Managee 5. Modes et Configuration du GC
CLR (Common Language Runtime) Moteur d'execution .NET — equivalent
Workstation
JVM en Java
GC Mode par defaut pour apps desktop — GC sur t
Managed Heap Zone memoire geree automatiquement
Server
par leGC
GC 1 thread GC par CPU — optimal pour [Link]
Stack Memoire par thread — variables locales
Concurrent
et appels GC Background GC — reduit les pauses Stop-The-W
Large Object Heap (LOH) Objets >= 85 000 octets — rarement compacte
DATAS GC .NET 7+ — Dynamic Adaptation To App Size
Pinned Object Heap (POH) [Link]:
.NET 5+ — objets fixes en memoire (interop natif)
"GCConserve": false, "ServerGC": true,
2. Value Types vs Reference Types "GCHeapHardLimit": 536870912 // 512 MB max
VALUE TYPES REFERENCE TYPES
(struct, int, bool, float…) (class, string, array…) 6. Span<T>, Memory<T> et Allocation Zero
Stockage: Stack (ou inline dans objet) Stockage: Heap — reference sur Stack
Span<T> Vue sur memoire contigue — Stack only, zero a
Copie: Par valeur — copie complete Copie: Par reference — meme objet
ReadOnlySpan<T> Version lecture seule — ideal pour parsing de st
GC: Non collecte par le GC GC: Collecte si plus de reference
Memory<T> Comme Span<T> mais utilisable en async / Hea
Nullable: int? avec Nullable<T> Null: Nullable par defaut
ArrayPool<T> Reutilisation de tableaux — evite allocations rep
Perf: Tres rapide — pas d'allocation Perf: Allocation + GC overhead
stackalloc Alloue sur la Stack — stackalloc int[128] — Spa
Heritage: Derive de [Link] Heritage: Derive de [Link]
ref struct Struct ne pouvant exister que sur la Stack — ze
3. Generations du Garbage Collector
7. References Faibles et GC Handles
Gen 0 WeakReference<T>
Objets recemment alloues. Collection la plus frequente et la plus rapide. Dure < 1ms. Reference non bloquante — GC peut colle
[Link]() Epingle un objet (Pinned) pour interop ave
ConditionalWeakTable Associe metadonnees sans empecher la c
Gen 1 [Link](obj)
Buffer entre Gen 0 et Gen 2. Objets ayant survecu a 1 collecte. Collection moderee. Empeche le GC de collecter obj avant cet
[Link]() Force une collecte — a eviter en productio
[Link]() Retourne la taille approx. du Heap manage
Gen 2 Objets a longue duree de vie (caches, singletons). Collection couteuse — eviter.
8. Diagnostics et Outils de Profiling
LOH Large Object Heap : objets >= 85 000 octets. Rarement compacte — risquedotnet-counters
de fragmentation. Metriques temps reel : GC, allocations, threads
dotnet-dump Capture et analyse de dump memoire
dotnet-gcdump Dump du GC Heap pour analyse dans VS / Pe
PerfView Outil Microsoft — ETW events, allocation profil
4. IDisposable et Ressources non managees
Visual Studio Diagnostic Tools — Heap Snapshot, allocation
IDisposable Interface a implementer pour liberer ressources nonBenchmarkDotNet
managees Micro-benchmarks precis — mesure allocation
Dispose() Appele explicitement ou via using — liberation deterministe
MemoryDiagnoser [MemoryDiagnoser] attribute — allocations par
using block using (var r = new Resource()) { … } — Dispose() garanti
using decl. using var r = new Resource(); — .NET Core 3+ syntaxe
9. Bonnes Pratiques — Anti-patterns
Finalizer ~T() Appele par GC si Dispose() oublie — non deterministe, lent
SafeHandle A FAIRE ✓
Wrapper securise pour handles natifs (fichiers, sockets…)
Toujours implementer IDisposable pour ressources non managees
Privilegier Span<T> et ArrayPool<T> pour eviter les allocations
Utiliser struct pour petits types immutables (<= 16 octets)
Configurer ServerGC en production ([Link] Core)
A EVITER ✗
Appeler [Link]() manuellement en production
Implementer un finalizer sans IDisposable (pattern Dispose)
Ignorer les warnings d'allocation dans les hot paths
CLR Memory Quick Reference
Managed Heap Stack LOH >= 85KB Gen 0 / 1 / 2 IDisposable Span<T> WeakReference ServerGC A
.NET 8 LTS — CLR Memory Management — Reference pedagogique
.NET / CLR Memory Management — Reference Sheet
CLR • Managed Heap • GC Generations • Span<T> • IDisposable • Diagnostics
.NET 8 LTS — Document pedagogique