Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java & mémoire

Java & mémoire

Avatar for Zakia Ajouaoui

Zakia Ajouaoui

May 25, 2023
Tweet

More Decks by Zakia Ajouaoui

Other Decks in Programming

Transcript

  1. Plan I. Introduction II. Composants de la JVM III. Le

    Garbage Collector IV. Organisation de la mémoire VI. Superviser la mémoire 2
  2. “Write once, run anywhere” Java 1.0 : 1996 (Linux, Solaris,

    Windows, Mac) JVM : Spécifications https://docs.oracle.com/javase/specs/ HotSpot JRockit OpenJ9 Introduction 3
  3. 4

  4. Moteur d'exécution Vue simplifiée Class Loader Zones de données d'exécution

    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
  5. Thread N Pile de méthodes java (stack) Tas (heap) Instances

    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
  6. 7

  7. Pourquoi ? Composants de la JVM - Le Garbage Collector

    - Organisation de la mémoire - Superviser la mémoire 8 int **matrice=NULL, i; /* allocation de la mémoire */ matrice = malloc( 3 * sizeof(int*)); for(i = 0 ; i < 3 ; i++ ){ matrice[i] = calloc (3, sizeof(int)); } /* remplissage */ for( i = 0 ; i<3 ; i++ ) matrice[i][i] = 1; /* libération de la mémoire */ for ( i = 0 ; i<3 ; i++){ free(matrice[i]); matrice[i] = NULL ; } free(matrice); matrice = NULL; int[][] matrice; /* allocation de la mémoire */ matrice = new int[3][3]; /* remplissage */ for(int i = 0 ; i<3 ; i++ ) matrice[i][i] = 1; /* libération de la mémoire */ /* :) */ C Java - Augmentation du niveau d’abstraction de la programmation - Sécurisant : - Impossible de désallouer un objet encore référencé - Impossible d'accéder à une zone mémoire précédemment désallouée
  8. Comment ? Deux stratégies : - Mark and Evacuate -

    Mark, Sweep and Compact 9 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
  9. Comment ? 10 Composants de la JVM - Le Garbage

    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
  10. Comment ? 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 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
  11. Comment ? - Techniques directes - Identification des objets à

    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
  12. 13 public class Test { public static int max; private

    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
  13. Objets accessibles depuis l’extérieur de la heap : - Threads

    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
  14. Quelques algorithmes Tas Paris ref : 1 15 Composants de

    la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire • Reference counting • Mark and Sweep • Stop and Copy
  15. Tas Lyon ref : 1 Paris ref : 1 Lyon

    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
  16. Tas Lyon ref : 1 Bordeaux Bordeaux ref : 1

    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
  17. Tas Bordeaux ref : 1 Marseille Paris ref : 1

    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
  18. Tas Bordeaux ref : 1 Marseille Paris ref : 1

    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
  19. Tas Bordeaux ref : 0 Marseille Paris ref : 1

    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
  20. Tas Paris ref : 1 Lyon Marseille Lyon ref :

    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
  21. Tas Lyon ref : 1 Marseille Marseille ref : 1

    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
  22. GC Roots Tas Quelques algorithmes 23 Composants de la JVM

    - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire • Reference counting • Mark and Sweep • Stop and Copy
  23. 24 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 GC Roots Tas
  24. 25 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 Tas GC Roots
  25. Quelques algorithmes 26 Composants de la JVM - Le Garbage

    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
  26. 27 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 Espace 2 Espace 1 Tas Interruption du programme
  27. 28 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 Espace 1 Espace 2 Tas Reprise du programme
  28. L’événement “Stop-The-World” 1. Mise en attente de tous les threads

    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
  29. Plusieurs Algorithmes de GC - Serial GC - Parallel GC,

    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
  30. Concurrent Mark and Sweep Marquage Initial Marquer les objets directement

    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
  31. 34 Concurrent Mark and Sweep Composants de la JVM -

    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
  32. Répartition par générations La plupart des objets meurent tôt ⇒

    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
  33. Répartition par générations Parallel GC Stratégie Mark and Evacuate Parallel

    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
  34. Thread N Pile de méthodes java (stack) Tas (heap) Instances

    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
  35. Eden S1 -Xms -Xmx -XX:PermSize -XX:MaxPermSize Old Permanent -XX:NewSize -XX:MaxNewSize

    S2 Définition des tailles 39 Composants de la JVM - Le Garbage Collector - Organisation de la mémoire - Superviser la mémoire
  36. Eden S1 -Xms -Xmx “java.lang.OutOfMemoryError: Java heap space” “java.lang.OutOfMemoryError: Requested

    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
  37. Causes possibles : • Fuite mémoire • Taille de la

    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
  38. Quelques erreurs 42 “java.lang.OutOfMemoryError: GC Overhead limit exceeded” : le

    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
  39. Quelques erreurs 43 “java.lang.OutOfMemoryError: Requested array size exceeds VM limit”

    : 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
  40. Quelques erreurs 44 “java.lang.OutOfMemoryError: PermGen space” : se produit au

    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
  41. Quelques erreurs 45 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 : ⁻ 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
  42. Eden S1 Old S2 -XX:NewSize -XX:MaxNewSize Depuis Java SE 8.0

    : 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
  43. Zoom sur le Garbage-First (G1) 47 - Par défaut environ

    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
  44. Zoom sur le Garbage-First (G1) 48 ➢ Temps de latence

    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
  45. 49 Choisir un GC Serial GC Parallel GC / Parallel

    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
  46. Interactions avec l’application 50 - System.gc() - Aucune garantie du

    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
  47. 51

  48. Outils de diagnostic - Logs du GC : - -verbose:gc

    -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
  49. La JConsole Simple d’utilisation Permet de visualiser les informations sur

    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
  50. Quelques vidéos The JVM and Java Garbage Collection : https://www.youtube.com/watch?v=DoJr5QQYsl8

    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
  51. Références - https://secweb.cs.odu.edu/~zeil/cs361/web/website/Lectures/garbageCollection/pages/referenceCounting.html - https://www.cubrid.org/blog/understanding-java-garbage-collection - https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html - http://www.oracle.com/technetwork/java/javase/tech/memorymanagement-whitepaper-1-150020.pdf -

    https://docs.oracle.com/javase/specs/jls/se9/html/index.html - https://www.ibm.com/support/knowledgecenter/en/SS3KLZ/com.ibm.java.diagnostics.memory.analyzer.doc/gcroots.html - https://www.ibm.com/support/knowledgecenter/fr/SSYKE2_7.0.0/com.ibm.java.win.70.doc/diag/understanding/jvm_compon ents.html - https://www.ibm.com/developerworks/library/j-nativememory-linux/index.html - https://gfx.developpez.com/tutoriel/java/gc/ - https://www.infoq.com/fr/articles/Java_Garbage_Collection_Distilled - https://plumbr.io/handbook/garbage-collection-algorithms-implementations - 55