2. 2
Sommaire
• Le framework .NET
La compilation
CLR
• La gestion de la mémoire
Heap
Stack
• Le garbage-collector
Son rôle
Son fonctionnement
Ses configurations
Son avenir
• Comment monitorer sa mémoire
4. 4
Framework .NET – Common Langage Runtime
« Le CLR (Common Language Runtime) est le cœur de Microsoft .NET Framework et fournit
l'environnement d'exécution de la totalité du code .NET Framework. »
Le CLR fournit divers fonctions et services requis pour l'exécution du programme:
•La compilation juste-à-temps (JIT just in time)
•la mise en application de la cohérence des types (CTS common type system)
•la gestion des exceptions
•la gestion des threads
•l'allocation et la gestion de la mémoire
5. 5
La gestion de la mémoire
Pile (stack)
•Allocation statique
•Appels des fonctions
•Le type valeur ( struct )
•Durée de vie cours (contexte de création)
Tas (heap)
•Allocation dynamique
•Zones nécessitant d’être libérée ensuite
•Le type référence comme une instance de classe ou de tableau, est alloué dans
une zone de mémoire différente appelée tas.
•Durée de vie (long) (référencé)
6. 6
Stack
B()
Class1 instance;
La gestion de la mémoire
Heap
Main
A()
Instance3
Instance4
Instance2
Class2 instance;
int i;
struct i;
Class3 instance;
Instance1
7. 7
La gestion de la mémoire - Stack
• Limite: 1Mo par défaut
• Exception StackOverflowException
Exemple
8. 8
La gestion de la mémoire - Heap
• Limite: 2Go (Limite système)
• Exception OutOfMemoryException
Exemple
9. 9
Le garbage-collector – Son rôle
(ramasse-miettes)
• Il vous permet de développer sans avoir à libérer de la mémoire.
• Il alloue efficacement les objets sur le tas managé.
• 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.
• Il sécurise la mémoire en s'assurant qu'un objet ne peut pas utiliser le contenu
d'un autre objet.
10. 10
Le garbage-collector – Son fonctionnement
1. Initialisation du GC par le CLR
2. Allocation d’un segment de mémoire pour stocker et gérer des objets sur tas
managé.
• Il existe un tas managé pour chaque processus managé.
• Tous les threads du processus allouent des objets sur le même tas.
11. 11
Le garbage-collector – Son fonctionnement
• le garbage-collector libère la mémoire occupée par les objets morts.
Le processus de libération compacte les objets vivants afin qu'ils soient
déplacés ensemble.
• L'espace inutilisé est supprimé, ce qui entraîne la diminution du tas.
12. 12
Le garbage-collector – Son fonctionnement
1. Arrêt de tout les threads
2. Crée une liste de tous les objets actifs.
3. Mise à jour des références aux objets qui seront compactés
4. Une phase de compactage qui libère l'espace occupé par les objets morts et
compacte les objets survivants. La phase de compactage déplace les objets qui
ont survécu à un garbage collection vers l'extrémité la plus ancienne du segment.
13. 13
Le garbage-collector – Son fonctionnement
Le tas est organisé en générations.
•Génération 0 objets éphémères (zone majeure de garbage collection)
•Génération 1 objets éphémères
•Génération 2 objets durables
14. 14
Le garbage-collector – Son fonctionnement
• Une opération de garbage collection se fait sur une génération est ses génération
plus jeune.
• Garbage Collection de génération 2 garbage collection complet
• Les objets survivants à une collection sont promus à la génération suivante
15. 15
Le garbage-collector – Sa Configuration
• Le garbage collector s'ajuste automatiquement.
• gcServer (optimisation >2 processeurs)
• Uniquement pour les station multiprocesseur
• GC « station de travail » autrement
• gcConcurrent
• GC simultanée, depuis .NET 4 GC d’arrière plan
<configuration>
<runtime>
<gcServer enabled=« false" />
<gcConcurrent enabled=« true"/>
</runtime>
</configuration>
16. 16
Le garbage-collector – Sa Configuration
• gcServer
• Uniquement pour les stations multiprocesseurs
• Optimisé pour le débit
• 1 Thread GC par CPU en THREAD_PRIORITY_HIGHEST
• 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
• GC « station de travail » autrement
17. 17
Le garbage-collector – Sa Configuration
• gcConcurrent
• Exécuter la collection en même temps sur un thread dédié
• 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.
• Uniquement pour « station de travail »
• Depuis .NET 4.5 pour « server/station de travail »
19. 19
Le garbage-collector – Sa Configuration
• LatencyMode
• Batch
• Désactive GCConcurrent et libère des objets dans un appel de lot.
• ↗ débit
• ↘ réactivité.
Interactive
• Active GCConcurrent (mode courant)
LowLatency
• Attend d’être sous pression mémoire pour lancer une collection (complet / gen2)
• Période limité dans le temps (~opération marché financier)
SustainedLowLatency
• Idem LowLatency génération 2 en arrière plan
21. 21
Le garbage-collector
• En réalité, il y a deux types de heap:
• Small Object Heap (SOH) (Vu précédemment)
• Large Object Heap (LOH)
• Taille > 85 000 octets
• Fonctionnement différent
27. 27
Monitoring – CLR Profiler 1
Télécharger: http://download.microsoft.com/download/4/4/2/442d67c7-a1c1-4884-9715-803a7b485b82/clr%20profiler.exe
Application winform produisant des graphes pour l’analyse.
Entre autre:
• Heap Graph
Objets avec leurs connections durant l’execution
Allocation Graph
Pile d’appel d’allocation d’objet
Histogram By Age
Cycle de vie de l’allocation des objets
Histogram Relocated Types
Déplacement des objets dans une autre génération du GC
30. 30
Références
• Gestion de la mémoire et garbage collection dans le .NET Framework
http://msdn.microsoft.com/fr-fr/library/vstudio/0xy59wtx.aspx
• Technical Papers chez Red Gates
http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/technical-papers/
• Commandes sos.dll
http://msdn.microsoft.com/en-us/library/bb190764.aspx
• En complément
https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/
http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on-the-large-object-
heap.aspx
http://msdn.microsoft.com/fr-fr/magazine/cc163528.aspx