Gestion mémoire de la JVM
Garbage Collecting
Informations générales
Comme chacun sait, Java possède une machine virtuel qui a l'avantage de ne pas avoir à gérer la mémoire soit même comme c'est par exemple le cas en C (par l'intermédiaire des fonctions malloc et free).
Les objectifs de la JVM sont en fait double :
- Exécuter le code qui lui ai passé ;
- Gérer la mémoire, c'est-à-dire alouer la mémoire sur le système d'exploitation, gérer les objects en mémoire et les supprimer.
- Un objet collecté est un objet qui n'est plus référencé et qui est donc prêt à être supprimé.
- Le ramasse-miette est le second nom du Garbage Collector (ou GC).
Fonctionnement générale
La JVM gère deux types d'objets en mémoire :
- Les objets jeunes, qui viennent d'être créés (après l'utilisation d'un new) ;
- Les objets vieux, qui ont une certaine durée de vie dans l'application.
Pour chacune de ces zones, il existe plusieurs algorithmes de collection que l'on peut soit sélectionner, soit laisser au choix de la JVM.
Le déclenchement de la collecte se fait lorsque la mémoire est pleine (il s'agit plus exactement d'un seuil, 80% de la mémoire disponible par exemple). Lorsque la zone jeune est pleine, l'opération nommée GC (pour Garbage Collecting) se charge de nettoyer cette zone uniquement. Mais lorsque la zone vieille est pleine, l'opération se nomme alors Full GC et se charge de nettoyer l'ensemble des zones.
Il est important de noter que lors d'une opération de collecte mémoire, l'ensemble des threads de la JVM est coupé.
Cette période d'arrêt est nommée "Stop-the-World pause".