Comment est gérer la mémoire dans une application Java?

Le rôle de la JVM est de lire une application composée de fichiers .class sous différentes formes à l'aide d'un chargeur de classes et de l'exécuter

>
 -  Publié le
Comment est gérer la mémoire dans une application Java?

La machine virtuelle Java ou JVM est un environnement d'exécution pour applications Java. © Académie WS - academiews.fr

Dans nos précédentes vidéos vous avez appris le rôle du JRE qui est composé de l'API Java et de la JVM mais revenons dans cette partie sur la gestion de la mémoire en Java. Le rôle de la JVM est de lire une application composée de fichiers .class sous différentes formes (zip, jar, war, ou encore un simple tableau d'octets) à l'aide d'un chargeur de classes et de l'exécuter, ainsi que l'API Java.

Dans cette vidéo nous allons entrer un peu plus dans le détail de la gestion de la mémoire en Java, vous êtes prêts? C’est partit !

La machine virtuelle Java ou JVM (Java Virtual Machine) est un environnement d'exécution pour applications Java. Elle assure l'indépendance du matériel et du système d'exploitation lors de l'exécution d’une applications Java en ne l’exécutant pas pas directement dans le système d'exploitation mais dans une machine virtuelle qui s’exécute elle-même dans le système d'exploitation et propose une couche d'abstraction entre l'application Java et ce système.

La JVM permet notamment l'interprétation du bytecode, l'interaction avec le système d’exploitation, ou encore la gestion de sa mémoire grâce au ramasse-miettes (connue sous le nom de Garbage Collector) en exécutant des instructions qui manipulent différentes zones de mémoire dédiées de la JVM.

Attention, la machine virtuelle ne connaît pas le langage Java mais que le bytecode qui est issu de la compilation du code source écrit en Java.

Les spécifications de la JVM définissent :

  • - les concepts du langage Java
  • - le format des fichiers .class
  • - les fonctionnalités de la JVM
  • - le chargement des fichiers .class
  • - le bytecode
  • - la gestion des threads et des accès concurrents

Pour infos il existe d’ailleurs de nombreuses implémentations de JVM dont les plus connues sont celles de Sun Microsystems/Oracle (HotSpot), IBM (J9), BEA/Oracle (JRockit), Azul (Zing), ...

La mémoire de la JVM

Heureusement pour nous, Java propose de simplifier la vie des développeurs :

  • - puisqu’il n'est pas possible d'allouer de la mémoire explicitement : c'est la création d'un nouvel objet avec l'opérateur new (lors de l’instanciation d’une classe) qui alloue la mémoire requise
  • - de plus, la JVM dispose d'un ramasse-miettes (ou Garbage collector) qui se charge de libérer la mémoire des objets inutilisés

Comment fonctionne ce fameux ramasse miettes?

La machine virtuelle Java utilise un processus de récupération automatique de la mémoire des objets inutilisés. Ces objets inutilisés ne sont autres que les objets qui ne sont référencés par aucun autre objet.

Cela évite aux développeurs d'avoir à se soucier de cette récupération dans le code mais cela présente néanmoins quelques inconvénients :

  • - d’une part il n'est pas possible de connaître le moment où la mémoire d'un objet sera libérée
  • - d’autre part le ramasse-miettes ne permet pas aux développeurs de connaître son mode de fonctionnement et de prendre quelques précautions pour éviter les fuites de mémoire

Chaque JVM implémente son propre ramasse-miettes qui peut mettre en oeuvre plusieurs algorithmes pour rechercher les objets inutilisés et récupérer automatiquement la mémoire de ces objets.

Les différentes zones de la mémoire

Le stockage des données dans la JVM est opéré dans différentes zones réparties en deux grandes catégories :

  • - les zones de mémoire dont la durée de vie est égale à celle de la JVM qui sont créées au lancement de la JVM et sont ensuite détruites à son arrêt
  • - les zones de mémoire liées à un thread dont la durée de vie est égale à celle du thread concerné

Plusieurs zones de mémoire sont utilisées par la JVM :

  • - les registres (register) qui sont des zones de mémoires utilisées par la JVM exclusivement lors de l'exécution des instructions du byte code.
  • - une ou plusieurs piles (stack)
  • - un tas (heap)
  • - une zone de méthodes (method area)

Mais à quoi correspondent-ils vraiment? Explications !

La Pile (Stack)

En Java, chaque thread possède sa propre pile dans laquelle on retrouve les variables locales, les paramètres, les valeurs de retours des méthodes invoquées par ce même thread. Attention, seules les données de types primitif et les références aux objets peuvent être stockées dans la pile. Autrement dit, pas d’objet ici :)

La taille d'une pile peut être précisée à la machine virtuelle, cependant attention aux exceptions de type StackOverflowError dans le cadre d’une pile trop petite pour les besoins du thread, ou OutOfMemoryError si la mémoire de la JVM ne permet pas l'allocation de la pile d'un nouveau thread.

Le tas (Heap)

Le tas est quand à lui partagé par tous les threads de la JVM  dans lequel elle stocke toutes les instances des objets créés. Attention, les tableaux étant des objets en Java, ils sont donc stockés dans le tas même si ce sont des tableaux de types primitifs. Dans le tas, la libération de cet espace mémoire est effectuée grâce au Garbage Collector que nous avons mentionné plus tôt.

La taille du tas peut être fixe ou variable durant l'exécution de la JVM, attention tout de même aux exceptions de type OutOfMemoryError si la taille du heap ne permet pas le stockage d'un objet en cours de création.

La zone de mémoire "Method area »

La zone de mémoire "Method area » est quand à elle partagée par tous les threads et stocke la définition des classes et interfaces, les constructeurs les méthodes, les constantes ou encore les variables de classe (dites static) Cette zone est similaire à la pile à la différence qu’elle est partagée par tous les threads !

La zone de mémoire "Code Cache »

Finalement la zone de mémoire « Code Cache » stocke le résultat compilé du code des méthodes.

Le fonctionnement et la gestion de la mémoire en Java par la JVM n’a maintenant plus de secret pour vous, il ne vous reste plus qu’à suivre nos vidéos pour créer vos premiers algorithmes en Java :)

En savoir plus

Envie d'en savoir plus sur le sujet? retrouvez l'intégralité de la formation vidéo liée à la thématique 'Créer une application en Java' sur le site de l'Académie WS !

Commentaires :

Recevez par email toute l’actualité du digital

En cliquant sur "S'inscrire", vous acceptez les CGU ainsi que notre politique de confidentialité décrivant la finalité des traitements de vos données personnelles.

Abonnez-vous à la newsletter de la réponse numérique