Les espaces mémoire de la JVM

La machine virtuelle Java dans laquelle s’exécutent tous les programmes écris en Java est un outil très performant. Les développeurs Java n’ont plus besoin de gérer la mémoire comme ils le faisaient en langage C. Cette gestion de la mémoire est effectuée par le Garbage Collector (GC). Cependant, le GC étant un programme lui-même, il consomme CPU et mémoire. Afin de diminuer son impact, les développeurs de chez SunMicrosystems ont créé différents espaces mémoire qui seront traités de manières différentes par le GC.

javaEspaceMémoire

Java est un langage moderne qui permet au développeur d’éviter les traitements trop laborieux de gestion de la mémoire. Cependant, la JVM n’est pas paramétrée pour réaliser une gestion parfaite pour tous les projets que l’on peut faire en Java. Elle propose de nombreux paramétrage qui vont donner aux développeurs d’améliorer ses performances sans être une charge considérable pour la phase de développement. Ces paramétrages permettent la définition d’un profil qui doit être le plus adapté aux conditions d’utilisation de la JVM. En effet, le Garbage Collector (GC) consomment des ressources supplémentaires dans la JVM aves les traitements métiers lors de son passage. Avec un paramétrage mal choisi, la JVM peut finir bloquée par un GC trop gourmand, alors que l’application en elle-même n’est pas surchargée. D’autres zones mémoire sont également utilisées par la JVM comme par exemple la Pile.

Le Heap

La mémoire de la JVM est occupée par les objets qui sont créés tout au long de la vie d’une application. Chaque définition d’une variable va faire une demande d’allocation mémoire à la JVM. Cette mémoire est allouée sur le tas (heap) et mise à disposition de l’application. La libération de la mémoire est effectuée par le GC lorsque l’objet n’est plus référencée dans les applications.

Le travail du GC

Le travail du GC est donc de parcourir le tas à la recherche d’objets qui ne sont plus référencés et de les détruire afin de libérer la mémoire. La manière la plus simple de le faire est de parcourir l’ensemble du tas et vérifier chaque objet présent en mémoire. Cette manière de faire est très consommatrice en ressources et rendrait le traitement de collection beaucoup trop volumineux. Afin d’optimiser le traitement de collection, il a donc fallu étudier la manière dont les applications utilisent les objets. De cette observation est ressortie que beaucoup d’objets sont utilisés très peu de temps et détruits par la suite (exemple des Iterator utilisés pour une boucle uniquement). Il faudrait donc imaginer différentes zones permettant au GC de classer les objets en fonction de leur durée de vie.

Décioupage mémoire JVM

Les objets vont être stockés dans la première zones puis évoluer tout au long de leur vie jusqu’à la dernière zone. Ainsi, le GC se concentre sur les objets les plus jeunes afin d’optimiser la collection des objets non référencés

Young

A la création d’un objet, celui-ci est stocké dans la première zone nommée Eden. Tous les objets de cette zone sont appelés objets de la jeune génération. C’est dans cette zone que le GC va passer le plus souvent à la recherche des objets non référencés et cela à chaque fois que la zone Young est pleine. D’après les études réalisées, c’est dans cette zone que sont présents la majorité des objets qui vont être collectés. Cela permet d’éviter le parcours de l’intégralité du tas par le GC. Les collections de cette zones sont appelé collections mineures.

Les zones Survivors sont des zones qui vont accueillir les objets vivants après la collection de la zone Eden. Les objets vont d’abord tous aller dans la première zone Survivor. Puis ils vont changés de zone Survivor à chaque collection. Après un certain nombre d’échanges ou si la place vient à manquer, ils seront déplacés dans la zone suivante: Tenured.

Création de l’objet => E => S1 => S2 => S1 => S2 => … => T

Tenured

Les objets qui arrivent dans cette zone sont ainsi des objets qui ont subi plusieurs collections mais qui sont toujours référencés. Le GC ne va passer dans cette zone que lorsqu’elle est remplie au-delà d’un certain seuil qui est représenté par un ratio entre la mémoire libre et la mémoire occupée. Les collections de cette zone sont appelées collections majeures.

Les collections dans cette zone sont coûteuses. La zone étant plus grande que la zone Young son contenu est plus volumineux et est donc plus long à collecter. Cette zone peut être également utilisée par le GC plus rapidement que ne le définit la partie précédente. En effet, dans le cas d’une allocation de nombreux objets, il est possible que cette zone soit utilisée pour des nouveaux objets dans le but d’augmenter la taille de la zone Young.

Perm

Cette zone est particulière car elle ne subit aucune collection. Elle contient les classes qui vont être chargées au démarrage de la JVM et qui n’ont pas le cycle de vie des applications s’exécutant dans la JVM. Tous les objets qui sont stockés ont une durée de vie égale à celle de la JVM, elles sont détruites à l’arrêt de celle-ci. Cette zone contient notamment le code binaire de chaque classe chargée pour l’exécution des différentes applications au sein de la JVM.

Les zones Virtual

Chacune des zones précédentes possède une partie Virtual. Cette zone est un espace tampon qui sera utilisé par la zone en question en cas de besoin. La taille mémoire de la JVM étant attribuée lors de son démarrage, ces zones ne sont pas utilisées tout de suite afin d’accélérer le temps de traitement du GC en diminuant la taille de l’espace qu’il doit vérifier.

En dehors du Heap

La Stack (Pile)

Cette zone est associée à chaque Thread de la JVM et n’est pas accessible par les autres Thread. Elle contient les variables locales, les paramètres, les valeurs de retour de chaque méthode uniquement si elles sont de type primitif, les objets étant présents dans le tas.

La Method Area

Cette zone stocke les définitions de l’ensemble des classes et interfaces, le code des différentes méthodes de celles-ci et les constantes et variables statiques de type primitifs uniquement.

Le Code Cache

Cette zone contient le résultat compilé du code des méthodes.

spacer

Laisser un commentaire