OS fichiers .class (bytecode) Interpreter JIT Compiler Garbage Collector Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire 5 Java Compilation
java Zone des méthodes Bytecode des méthodes Program Counter Register Adresse de l’instruction courante Pile de méthodes natives (C/C++) ... Zones de données d'exécution Frame N-x Frame N contexte d'exécution de la méthode en cours d'exécution, variables, attributs, paramètres, résultats intermédiaires... 6 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
Collector - Organisation de la mémoire - Superviser la mémoire Mark and Evacuate 1. Marquage des objets vivants 2. Copie des objets vivants dans une nouvelle zone mémoire 3. Réécriture des pointeurs pour référencer les nouvelles adresses Pas de fragmentation de la mémoire : La zone nettoyée est considérée comme vide. Temps de copie et de réécriture non négligeable ⇒ Adaptée à des espaces petits ou moyens ⇒ Temps d’exécution proportionnel au nombre d’objets vivants
2. Copie des objets vivants dans une nouvelle zone mémoire 3. Réécriture des pointeurs pour référencer les nouvelles adresses Pas de fragmentation de la mémoire : La zone nettoyée est considérée comme vide. Temps de copie et de réécriture non négligeable ⇒ Adaptée à des espaces petits ou moyens ⇒ Temps d’exécution proportionnel au nombre d’objets vivants 11 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Mark, Sweep and Compact 1. Marquage des objets vivants 2. Suppression des objets morts 3. Défragmentation de la mémoire Consommation de la mémoire moindre Temps de défragmentation non négligeable ⇒ Adaptée à de grands espaces
supprimer : - Reference Counting - Techniques indirectes - Identification des objets utilisés puis déduction des objets à supprimer : - Mark and Sweep - Mark, Sweep and Compact - Copying - ... 12 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
int objectif = 10; [...] public Test() { max = 100; int newObjectif = init * max; if(objectif > max){ System. out.println(“Nb max non atteint: " + max); }else{ init = newObjectif; } } } Durée de vie = durée d’exécution de la méthode Durée de vie = durée de vie du programme Durée de vie = durée de vie de l’instance de l’objet Quelques notions : Portée d’une variable Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
actifs - Objets de la pile d'exécution : - Variables locales - Paramètres - Classes chargées par le classloader, variables statiques Quelques notions : GC Roots 14 public class Test { public static int max; private int objectif = 10; public Test() { nombre++; int newObjectif = init * nombre; if(objectif > nombre){ System.out.println("Nbmax non atteint: " + nombre); } } } public class ClassMain { public static void main(String[] args) { Test testInstance = new Test(); for(int i = 0; i<100; i++){ if(args[0].equals("compter")){ testInstance.test(); } } Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
16 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
17 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Paris ref : 1 Lyon Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
Lyon Marseille Marseille ref : 3 Lyon Lyon ref : 1 Bordeaux Marseille Marseille ref : 3 18 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
Lyon Marseille Marseille ref : 3 Lyon Lyon ref : 2 Bordeaux Marseille Marseille ref : 3 Lyon 19 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
Lyon Marseille Lyon ref : 2 Bordeaux Marseille Marseille ref : 3 Lyon Marseille ref : 2 Lyon 20 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
2 Marseille Marseille ref : 2 Lyon Paris ref : 0 Lyon Marseille Lyon ref : 1 Marseille Marseille ref : 1 Lyon 21 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
Lyon En présence d’un cycle : Fuite de mémoire ! 22 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy
Collector - Organisation de la mémoire - Superviser la mémoire • Reference counting • Mark and Sweep • Stop and Copy Espace 1 Espace 2 Réservé Tas Interruption du programme
Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy Espace 2 Espace 1 Tas Interruption du programme
Organisation de la mémoire - Superviser la mémoire Quelques algorithmes • Reference counting • Mark and Sweep • Stop and Copy Espace 1 Espace 2 Tas Reprise du programme
en cours d’exécution : - Le GC envoi un signal aux threads en cours d'exécutions - A chaque retour de méthode ou itération de boucle, chaque thread vérifie s’il se trouve dans un état cohérent (safepoint) - si oui, le thread se met en attente 2. Exécution des traitements du GC 3. Reprise des fils d'exécution de l’application 29 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
Parallel Old GC - Concurrent Mark and Sweep (CMS) - Pour les applications demandant un Stop the World plus court -> adapté aux applications en Temps Réel - G1 - Destiné à remplacer le CMS 30 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
atteignable par les GC roots. Marquage Marquer tous les objets transitivement atteignables par les objets trouvés en 1. Pré-nettoyage Vérifier si l’état des objets trouvé en 2 à changé. Re-Marquage Marquer les objets qui ont été mises à jour à l’étape précédente. Balayage Mettre à jour les listes d'espaces libres en récupérant la mémoire occupée par les objets morts. Réinitialisation Réinitialiser les structures de données pour la prochaine exécution. 32 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire Limites : - Durée des pauses proportionnelle au nombre d’objets vivants - Pas de défragmentation préventive : ⇒ Concurrent Mode Failure : pas de bloc contigu suffisamment grand pour contenir un nouvel objet ⇒ Défragmentation complète de la heap → Stop The World
Stratégie Mark and Evacuate Plus longtemps un objet reste, plus longtemps il a de chance de rester ⇒ Stratégie Mark, Sweep and Compact Jusqu'à la fin d'exécution de la JVM Augmentation rapide de la taille au démarrage de la JVM puis stagnation Eden Survivor 1 (from) Survivor 2 (to) Définitions des classes, méthodes, et métadonnées (static, final) Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire 36 New aka. Young aka. Nursery Old aka. Tenured Permanent
Old GC CMS Stratégie Mark, Sweep and Compact Eden Survivor 1 (from) Survivor 2 (to) Définitions des classes, méthodes, et métadonnées (static, final) Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire 37 New aka. Young aka. Nursery Old aka. Tenured Permanent Serial GC Aucune action du GC
java Zone des méthodes Bytecode des méthodes Program Counter Register Adresse de l’instruction courante Pile de méthodes natives (C/C++) ... Frame N-x Frame N contexte d'exécution de la méthode en cours d'exécution, variables, attributs, paramètres, résultats intermédiaires... 38 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
array size exceeds VM limit” “java.lang.OutOfMemoryError: GC Overhead limit exceeded” ... -XX:PermSize -XX:MaxPermSize Old Permanent “java.lang.OutOfMemoryError: PermGen space” S2 -XX:NewSize -XX:MaxNewSize Définition des tailles 40 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
heap insuffisante • Utilisation excessive de finalizers ⁻ Pour chaque instance d’une classe possédant une méthode finalize (protected void finalize() { /*code*/ }), étant éligible à être collecté par le GC ≻ l’instance este défini par le GC comme étant finalizable ≻ Lorsque l’instance est éligible à être collectée par le GC -> placée dans une file d’attente contenant les objets en attente d’être “finalizés”, ainsi que tous les autres objets auxquels l’instance fait référence ≻ Un processus passe en revue tous les objets. Lorsque les objets de la file d’attente sont inaccessible depuis l’application, le processus appelle l’opération finalize() ≻ Les objets ayant été finalizés peuvent ensuite être traités par le GC pour libérer la mémoire allouée ⁻ Le GC ne garantie pas que la méthode finalize sera appelée pour tous les objets qui ne sont plus roots. Quelques erreurs 41 “java.lang.OutOfMemoryError: Java heap space” : un objet n’a pu être alloué dans la heap Comment prévenir les problèmes de mémoire liés aux objets Finalizable : http://www.oracle.com/technetwork/articles/java/finalization-137655.html Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
temps d’exécution du GC est supérieur à celui de l’application Cause : • Si le programme Java passe plus de 98% de son temps à passer le GC, • ET que la mémoire désallouée est inférieur à 2% de la heap, • ET que cela dure depuis 5 passages consécutifs du GC Alors cette exception est levée. Solution : Augmenter la taille de la heap Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
: l’objet que l’on cherche à allouer est de taille supérieure à celle de la heap Causes possibles : • Soit c’est un problème de configuration, il faut augmenter la taille de la heap • Soit c’est une problème d’algorithme dans l’application : on crée un objet anormalement grand. Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
démarrage de la JVM, pas de place dans la PermGen pour charger toutes les classes Causes possibles : • Taille max de la PermGen insuffisante par rapport à la quantité ou à la taille des classes à charger ⇒ Soit, augmenter la taille max ⇒ Soit, chargements excessifs de classes pouvant être dynamiques dans le code de l’appli • Peut arriver à la suite de nombreux redéploiements : Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
la PermGen insuffisante par rapport à la quantité ou à la taille des classes à charger ⇒ Soit, augmenter la taille max ⇒ Soit, chargements excessifs de classes pouvant être dynamiques dans le code de l’appli • Peut arriver à la suite de nombreux redéploiements : ⁻ Certaines librairies ne sont pas supprimées entre chaque redéploiement, elles restent dans la PermGen ⁻ Lors d’un nouveau redéploiement, ces librairies sont à nouveau chargées et s’accumulent ⁻ Solutions possible : - Soit redémarrer la JVM à chaque fois que l’erreur se produit - Soit : -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled ⇒ Suppression des objets habituellement conservés Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire “java.lang.OutOfMemoryError: PermGen space” : se produit au démarrage de la JVM, pas de place dans la PermGen pour charger toutes les classes
: Plus de PermGen Metaspace Par défaut : peut occuper la mémoire totale disponible du système -XX:MaxMetaspaceSize “java.lang.OutOfMemoryError: Metaspace” 46 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire -Xms -Xmx
2 048 régions - Chaque région fait entre 1 et 64Mo, en puissance de 2 - Régions générationnelles pas nécessairement contiguës Old : - Nettoie d’abord les régions contenant le plus d’objets non référencés (estimation faite en mode concurrent) ⇒ plus rapide à vider ⇒ stop-the-world très court - Compactage avec le déplacement New : - L’ensemble des objets de la génération est promue soit de E vers S, soit de S vers O - Intérêt des régions : génération plus facilement redimensionnable entre [-XX:G1NewSizePercent ; -XX:G1MaxNewSizePercent] http://www.oracle.com/technetwork/tutorials/tutorials-18 76574.html Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
réduit grâce aux nombreux threads qui s’exécutent en même temps que l’application. ➢ Adapté quand on veut un temps de pause très réduit et que l’on a pas de contrainte d’utilisation du CPU ➢ Erreur d’allocation : lorsque l’application alloue des objets plus vite que le GC récupère de l’espace libre a. Le GC copie des données d’une région à l’autre pour compacter l’espace utilisé b. Il ne trouve pas d’espace libre dans la région destination pour les objets en cours de copie c. Un Stop-The-World est lancé pour terminer le compactage des données http://www.oracle.com/technetwork/tutorials/tutorials-18 76574.html Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
Old GC CMS G1 Stop the World long moyen moindre moindre Utilisation CPU moindre importante moyenne importante Paramétrage -XX:+UseSerialGC ‑XX:+UseParallelGC ‑XX:+UseParallelOldGC -XX:+UseConcMarkSweepGC -XX:+UseG1GC Disponibilité jusqu'à java 8 : défaut à partir de java 9 : défaut Support officiel depuis java 7 Système cible petite mémoire, petit nombre de coeurs, partie cliente meilleur rapport temps appli/temps GC temps de réponse faible bonnes performances grand espace mémoire, forte disponibilité, partie serveur
démarrage du GC - Si il se produit : Full GC - Stop The World - Collection de tous les objets des 2 générations : très coûteux - Peut se produire à la suite d’un full GC ⇒ 2 full GC successifs -XX:+DisableExplicitGC Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps - GCViewer - Outils de supervisions : - HPJmeter - JConsole - JVisualVM - ... - Analyse de Heap Dump (ex : Eclipse Memory Analyzer) Pour une meilleure analyse, il convient de croiser les résultats des différents outils. 52 Composants de la JVM - Le Garbage Collector - Mémoire générationnelle - Superviser la mémoire
la consommation de l’application : - Performance - d'utilisation de la mémoire - de blocages et d’interblocages 53 Composants de la JVM - Le Garbage Collector - Mémoire générationnelle - Superviser la mémoire
Garbage collection in Java, with Animation and discussion of G1 GC : https://www.youtube.com/watch?v=UnaNQgzw4zY Serial, Parallel, CMS and G1 Garbage Collectors in Java : https://www.youtube.com/watch?v=GhEM1ZSyRVA 54