Régler la JVM ou optimiser le code Java : quelles différences ?
Le réglage de la JVM et l’optimisation de Java semblent similaires, et tous deux visent à améliorer les performances des applications. Mais ils adoptent des approches fondamentalement différentes pour atteindre leurs objectifs.
Les expressions « tuning JVM » et « optimisation Java » sont souvent utilisées de manière interchangeable, mais il existe une différence importante entre les deux pratiques. En bref, le réglage de la JVM nécessite un certain compromis entre des mesures telles que le débit et le temps de réponse. L’optimisation Java, quant à elle, améliore le système dans son ensemble, lorsqu’elle est mise en œuvre avec succès.
Le réglage de la machine virtuelle Java (JVM) nécessite une mémoire stable, une vitesse de processeur, une bande passante réseau et des applications hébergées. Ce système doit avoir un historique établi en matière d’indicateurs clés de performance (KPI). Les utilisateurs doivent disposer de mesures documentées telles que le débit, la latence, le temps de réponse et le nombre maximum de transactions par seconde. Le réglage de la JVM, ou de l’application consiste ensuite à modifier un paramètre, une configuration ou une variable d’environnement unique, puis à quantifier l’impact de cette modification sur le système.
Sur une JVM correctement configurée, le réglage des performances implique généralement un compromis entre différentes mesures. Par exemple, lorsque vous augmentez la taille du tas (heap), vous réduisez le nombre de cycles de collecte des déchets. Mais cela augmentera la durée des pauses « stop-the-world ». De la même manière, multiplier le nombre de threads utilisés par une application augmentera probablement les blocs de contention et provoquera des interblocages.
Dans un environnement Java entièrement optimisé, le réglage des performances de la JVM signifie inévitablement l’amélioration d’une mesure au détriment d’une autre. C’est un jeu à somme nulle, même si certaines configurations permettront une meilleure expérience utilisateur et une meilleure utilisation des ressources que d’autres.
Régler les performances de la JVM
Les objectifs communs des routines de réglage des performances des JVM consistent à surveiller les paramètres suivants :
- Taille maximale du heap
- Taille minimale du heap
- Taille du métaspace
- Types de collecte des déchets
- Configuration des logs
- Politiques de synchronisation
- Taille de la page
- Ratio Survivor
- Compression des String
En réglant ces options de la JVM, vous verrez les effets sur divers KPI, notamment la vitesse de démarrage, la latence des méthodes, le débit, les temps de pause de la collecte des déchets, la gigue applicative et les transactions par seconde. L’objectif du réglage est de trouver l’équilibre optimal entre ces KPI.
Java Mission Control peut aider à trouver des problèmes et optimiser la JVM.
Optimiser les performances de Java
L’optimisation de Java consiste à identifier le code, les frameworks, les bibliothèques, les configurations et, potentiellement, le matériel qui ne sont pas performants ou qui se comportent mal. Une fois que vous avez identifié un composant comme cible d’optimisation, vous retravaillez et testez à nouveau le système. Si cette cible est corrigée avec succès, le système dans son ensemble sera plus performant. Il n’y a pas de compromis entre les mesures ici.
Les étapes à suivre
L’optimisation implique généralement les étapes suivantes :
- Identifier un composant potentiellement peu performant.
- Obtenir des métriques d’exécution, avec un outil de profilage JVM tel que Java Flight Recorder ou VisualVM.
- Apporter des modifications au composant identifié jusqu’à ce que ses performances s’améliorent.
- Redéployer l’application avec le composant Java optimisé.
Les cibles à optimiser
Il existe plusieurs façons d’optimiser les performances de Java. Une méthode courante consiste à supprimer les goulets d’étranglement des applications. Pour ce faire, suivez les étapes suivantes :
- Utilisez les classes de collection les plus appropriées.
- Supprimez les mauvaises pratiques de programmation comme l’autoboxing de type primitif.
- Réduire les données renvoyées par les appels aux bases de données via Hibernate et JDBC.
- Évitez les méthodes synchronisées, qui provoquent des blocages de threads et des interblocages.
- Éliminez les pratiques de développement qui entraînent des fuites de mémoire Java.
Le réglage de la JVM et l’optimisation des performances Java sont des activités importantes dans le cycle de vie des applications. Elles optimisent les performances des applications et augmentent la capacité de débit de votre matériel local ou de vos ressources cloud. Elles devraient être un élément clé de la stratégie DevOps d’une organisation.