Fonctionnement MÉMOIRE de la JVM Pourquoi le sujet -> encore jamais vu -> sujet principale de la dernière section pro Julien Herr IR3 – 22/02/2008
Objectifs de l’exposé Faire comprendre le fonctionnement de la mémoire en Java Initier à l'optimisation mémoire Objectif Prise de conscience sur l’importance de la gestion mémoire en java Comprendre comment ca marche (outils jvm) : utilisateur -> ingénieur Notion sur la procédure d’optimisation
Sommaire Garbage Collecting Fonctionnement JVM Optimisation Garbage Collecting Généralités Buts et principe de fonctionnement général Fonctionnement JVM Différentes zones mémoires Différents algo de collection Optimisation de la gestion mémoire Le principe Mauvaises pratiques Les outils Bibliographie Questions ?
Garbage Collecting : Généralités Fonctionnement JVM Optimisation Différence du C Rappel sur malloc / free 2 fonctions principales pour la VM Exécuter le code Gérer la mémoire Objet collecté Un objet qui n'est plus référencé Vocabulaire : Ramasse miette, GC Petits rappels : Java = gestion de mémoire auto C = gestion à la main Gérer la mémoire = allouer à l’OS la mémoire, gérer ses objets en mémoire, les effacer
Garbage Collecting : Buts et fonctionnement général Fonctionnement JVM Optimisation 2 types d’objets Objets jeunes Objets vieux Plusieurs algorithmes de nettoyage Entres les 2 types d'objets Pour un même type d'objets Coupe tous les threads pendant le GC Déclanchement du GC lors du dépacement du seuil de mémoire utilisée Objets jeunes = qui viennent d’être créés Objets vieux = qui ont une certaine durée de vie dans l’application Seuil = % de mémoire libre / mémoire utilisée
Fonctionnement JVM : Différentes zones mémoires Garbage Collecting Fonctionnement JVM Optimisation Virtual = évolue au fil du temps
Fonctionnement JVM : Différents algorithmes : Serial Collector Garbage Collecting Fonctionnement JVM Optimisation New Object Region Old Object Region Eden SS1 SS2 Old Premier GC Eden SS1 SS2 Old Eden SS2 SS1 Old Second GC Eden SS2 SS1 Old Eden SS2 SS1 Old X GC
Fonctionnement JVM : Différents algorithmes : Mark & Sweep Compact Garbage Collecting Fonctionnement JVM Optimisation Début Full GC Old Fin Full GC Old
Fonctionnement JVM : Différents algorithmes : Parallel Collector Garbage Collecting Fonctionnement JVM Optimisation Utilisé dans la zone jeune
Fonctionnement JVM : Différents algorithmes : Concurent Mark & Sweep Garbage Collecting Fonctionnement JVM Optimisation Utilisé dans la zone old Tout au long de l’exécution de l’application Idéal pour pseudo temps réel (voip = court temps de pause, environ 300ms) Lourd -> grosse structure de liste chainée
Optimisation : Le principe Garbage Collecting Fonctionnement JVM Optimisation Stratégie par défaut de la JVM Algorithme de Garbage Collector Taille des zones mémoires Runtime Compiler (JIT) Dépendant de la machine et de l’OS Changeant suivant les versions
Optimisation : Le principe Garbage Collecting Fonctionnement JVM Optimisation Pourquoi optimiser ? Ne plus rencontrer l'erreur "Out of Memory Error" Défaut du perm size pour le code statique (ex : JSP) Throughput Goal % de temps passé à faire du GC Pause Goal Durée du GC Temps de GC proportionnel au nombre d'objet Besoin de temps de réponse optimal Temps de réponse actuels trop longs
Optimisation : Le principe Garbage Collecting Fonctionnement JVM Optimisation 3 types d'optimisations possibles Taille des zones mémoires Gérer l'intervalle de mémoire libre Type d'algorithme Evaluer ses besoins Faire des tests Empiriques Pas de recette magique
Optimisation : Mauvaises pratiques Garbage Collecting Fonctionnement JVM Optimisation System.gc() Doubler la quantité de mémoire
Outils : Sortie GC Commande JVM -verbosegc : Garbage Collecting Fonctionnement JVM Optimisation Commande JVM -verbosegc : [GC 1667K->1295K(1984K), 0.0101756 secs] [GC 1807K->1434K(1984K), 0.0223998 secs] [GC 1946K->1574K(2112K), 0.0116185 secs] [Full GC 1574K->1574K(2112K), 0.0830561 secs] [GC 3454K->2081K(4672K), 0.0495951 secs] [GC 4001K->2599K(4672K), 0.0274256 secs] [GC 4519K->3101K(5056K), 0.0308995 secs] [Full GC 3101K->3101K(5056K), 0.1452472 secs] [GC 7039K->4131K(9452K), 0.0777414 secs] [GC 8227K->5174K(9452K), 0.0627538 secs] [GC 9270K->6209K(10348K), 0.1125570 secs]
Outils : GC Portal Vieux : 2004 JVM 1.4 Garbage Collecting Fonctionnement JVM Optimisation Vieux : 2004 JVM 1.4 Lourdeur d'installation (scripts perl + sql) http://java.sun.com/developer/technicalArticles/Pr ogramming/GCPortal/
Outils : GC Portal
Outils : Visual GC http://management.netbeans.org/visualgc/index.ht ml Garbage Collecting Fonctionnement JVM Optimisation http://management.netbeans.org/visualgc/index.ht ml
Outils : Visual GC
Outils : JConsole Disponible dans le jdk Garbage Collecting Fonctionnement JVM Optimisation Disponible dans le jdk Répertoire bin Depuis JDK1.5 http://java.sun.com/developer/technicalArticles/J2 SE/jconsole.html
Outils : JConsole Garbage Collecting Fonctionnement JVM Optimisation
Optimisation : Le principe Garbage Collecting Fonctionnement JVM Optimisation Laisser faire la machine Attendre la stabilité Ajouter 15 % environ Tester
Optimisation : Difficulté Garbage Collecting Fonctionnement JVM Optimisation Il faut de l'expérience Changements D'une version à l'autre D'un constructeur à l'autre
Bibliographie http://www.javaperformancetuning.com/ http://java.sun.com/docs/performance/ http://java.sun.com/performance/reference/whitep apers/tuning.html http://java.sun.com/performance/reference/whitep apers/6_performance.html
Questions ?