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 certainement déjà développé des tas d'applications (applications desktop, applications mobiles, applications web, ...). Fonctionnellement parlant, si votre version de développement a bien été 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 erreurs suivantes : elles correspondent à des saturations de certains espaces mémoire.
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: Metaspace
Remarque : dans le cas spécifique de Hotspot (la JVM de la société Oracle), le second message n'est plus possible depuis sa version 8.0 et il sera remplacé par le troisième.
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.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :