Introduction au Garbage Collector (GC) Java

Une machine virtuelle Java (une JVM) est un environnement d'exécution complexe. Ce point est d'autant plus vrai si l'on regarde les mécanismes mis en jeux pour garantir la bonne gestion de votre mémoire. Au niveau des spécifications Java SE, il est dit que l'allocation de la mémoire est de votre responsabilité, mais la libération de la mémoire est de la responsabilité de la JVM. Mais cette spécification n'impose pas d'algorithmes de ramasse miettes particuliers. Chaque implémentation de JVM est donc libre de réaliser cette gestion à sa manière (pour peu que la mémoire soit finalement libérée). Nous ne pourrons pas dans ce document traiter toutes les JVM existantes. Nous nous concentrerons donc principalement sur celle d'Oracle, qui est souvent considérée comme étant l'implémentation de référence. Cette JVM a un petit nom : Hotspot.

En tant que développeurs Java, vous avez déjà certainnement déjà développé des tas d'applications (applications desktop, applications mobiles, applications web, ...). Fonctionnellement parlant, si votre version de développement a bien était testée, alors souvent en production les choses se passent relativement bien.

Sur un plan technique, les choses peuvent se passer nettement moins bien : peut être avez-vous déjà rencontré l'une des deux erreur suivantes : elles correspondent a des saturations de certains espaces mémoire.

java.lang.OutOfMemoryError: Java heap space

java.lang.OutOfMemoryError: PermGen space

Remarque : dans le cas spécifique de Hotspot, le second message n'est plus posible depuis sa version 1.8.0.

Afin de régler ces problèmes, avez-vous réalisé des batteries de jeux de tests d'endurance et de montée en charge ? Effectivement peut-être que votre application génère des fuites de mémoire. Peut-être, consomme-t-elle les instances de manière non adaptée. Dans les deux cas, les montées en charge et le fonctionnement dans la durée de votre JVM poseront de gros problèmes. Il faut donc bâtir des jeux de tests d'endurance et de montée en charge dans le but de collecter un certain nombre d'indicateurs sur le (bon, ou non) fonctionnement de votre JVM.

Collecter des indicateurs c'est bien, comprendre ces indicateurs, c'est mieux. Nous allons donc commencer par voir comment fonctionne un Garbage Collector et notamment dans le cas de la JVM Hotspot. Dans un second temps, nous présenterons un ensemble outils couramment utilisés pour profiler une application Java : certains de ces outils sont directement proposés par le JDK, d'autres sont téléchargeable sur Internet.

Chapitre suivant : Les différentes algorithmes de Garbage Collector