JavaRush /Blog Java /Random-FR /Un guide pour gérer la mémoire Java (et enregistrer votre...
pandaFromMinsk
Niveau 39
Минск

Un guide pour gérer la mémoire Java (et enregistrer votre code)

Publié dans le groupe Random-FR
Note du traducteur : l'envie de traduire la note est apparue tôt un matin de juin après l'avoir lue à moitié endormie dans un wagon de métro. Public cible : les personnes qui font leurs premiers pas dans le monde de Java et, en raison de la nature de leur formation technique de base ou de leur désir, sont très désireuses de se familiariser avec Java et d'apprendre tous les processus « électrodynamiques ». Je suis sûr que pour ceux qui liront ceci, ce sera le point de départ d'un voyage dans le monde de la configuration de la JVM et du GC. Un vent favorable! Article original ici En tant que développeur, vous passez d'innombrables heures à éliminer les bogues d'une application Java et à obtenir des performances là où elles doivent être. Pendant les tests, vous remarquez que l'application s'exécute progressivement plus lentement et, à la fin, elle plante complètement ou affiche simplement des performances médiocres. Finalement, acceptez que des fuites de mémoire se produisent. Le garbage collector Java fait de son mieux pour traiter ces fuites. Mais il n’y a qu’un nombre limité de choses à faire face à des situations comme celles-ci. Vous avez besoin de moyens pour identifier les appels de fuite de mémoire, identifier les causes et comprendre le rôle du garbage collector Java dans l'impact sur les performances globales des applications.

Principaux symptômes des fuites de mémoire Java

Plusieurs symptômes indiquent qu'une application présente des problèmes de fuite de mémoire. Une légère diminution des performances, plutôt qu'une panne soudaine d'application, indique uniquement une fuite de mémoire. Le problème peut survenir à chaque fois pendant le fonctionnement ou uniquement lorsque l'application commence à fonctionner avec une grande quantité de données ou, au contraire, lorsque vous commencez à faire évoluer l'application. L'application affichera probablement une erreur de mémoire insuffisante une fois que la fuite aura consommé toutes les ressources mémoire disponibles. Si vous redémarrez l'application et espérez le meilleur, vous rencontrerez des plantages répétés jusqu'à ce que la fuite soit réparée. En général, les fuites de mémoire se produisent lorsque les références d'objets s'accumulent au lieu de libérer de la mémoire. Ils occupent toute la mémoire disponible et empêchent l'application d'accéder aux ressources dont elle a besoin.

Erreurs de configuration apparaissant sous forme de fuites de mémoire

Avant d'examiner les situations qui causent des problèmes de mémoire Java et d'effectuer une analyse, vous devez vous assurer que la recherche n'est pas liée à un problème complètement différent. Certaines erreurs de mémoire insuffisante se produisent en raison de diverses erreurs, telles que des erreurs de configuration. L'application peut manquer de mémoire tas ou être en conflit avec d'autres applications du système. Si vous commencez à parler de problèmes de mémoire insuffisante mais que vous ne parvenez pas à comprendre la cause de la fuite, jetez un regard différent sur l'application. Vous constaterez que vous devez apporter des modifications au thread de finalisation ou augmenter la quantité d'espace de génération permanente, qui est une zone de mémoire JVM pour stocker les descriptions des classes Java et certaines données supplémentaires.

Avantages des outils de surveillance de la mémoire

Les outils de surveillance de la mémoire offrent une meilleure visibilité sur l'utilisation des ressources disponibles par une application Java. En utilisant ce logiciel, vous faites un pas en avant vers une recherche plus précise de la racine du problème des fuites de mémoire et d'autres incidents de performances. Les outils sont répartis en plusieurs catégories et vous devrez peut-être utiliser diverses applications pour déterminer comment signaler correctement le problème et ce qui n'a pas fonctionné, même si vous êtes confronté à des fuites de mémoire. Les fichiers de vidage de tas fournissent les informations nécessaires à l'analyse de la mémoire Java. Dans ce cas, vous devez utiliser deux outils : un pour générer un fichier de dump et un autre pour une analyse détaillée. Cette solution fournit des informations détaillées sur ce qui se passe avec l'application. Une fois que l'outil identifie les emplacements des problèmes possibles et s'efforce de affiner la zone pour découvrir l'emplacement exact de l'incident. Et cette période de temps est la période la plus longue et la plus déprimante des essais et des erreurs. L'analyseur de mémoire indique plusieurs problèmes dans votre code, mais vous n'êtes pas absolument sûr des problèmes rencontrés par votre application. Si vous rencontrez toujours la même erreur, recommencez et travaillez sur une autre erreur possible. Effectuez une modification à la fois et essayez de reproduire l'erreur. Vous devrez laisser l'application s'exécuter pendant un certain temps pour reproduire les conditions d'erreur. S'il y a une fuite de mémoire lors du premier test, assurez-vous de tester en charge l'application. Une application peut fonctionner correctement avec une petite quantité de données, mais peut à nouveau générer les mêmes erreurs lorsqu'elle travaille avec une grande quantité de données. Si la même erreur persiste, vous devez recommencer et rechercher une autre cause possible. Les outils de surveillance de la mémoire prouvent leur utilité une fois l'application pleinement opérationnelle. Vous pouvez surveiller à distance les performances de la JVM et détecter de manière proactive les situations de défaillance avant qu'un développeur ne se penche sur le problème et ne collecte des données de performances historiques pour l'aider à améliorer ses techniques de programmation à l'avenir et voir comment Java fonctionne sous une charge importante. De nombreuses solutions incluent des modes d'alerte « danger » ou d'autres modes similaires afin que le développeur puisse immédiatement savoir ce qui ne va pas. Chaque développeur ne souhaite pas qu'une application critique, en production, plante et entraîne une perte de dizaines ou de centaines de milliers de dollars pendant les temps d'arrêt de l'application. Les outils de surveillance de la mémoire réduisent donc le temps de réponse du développeur. Les applications de surveillance de la mémoire vous permettent de démarrer le processus de diagnostic instantanément, au lieu de vous demander de vous rendre chez le client, où personne ne vous dira exactement quelle erreur s'est produite ou quel code d'erreur l'application a généré. Si vous vous retrouvez souvent plongé dans des problèmes de mémoire et de performances de votre application Java, plongez-vous en profondeur dans le processus de test. Identifiez chaque point faible du processus de développement et modifiez vos stratégies de test. Consultez vos collègues et comparez vos approches de test avec les meilleures pratiques existantes. Parfois, vous devez réviser un petit morceau de code et garantir ensuite un impact durable sur l’ensemble de l’application.

Rôle du Garbage Collector sur la mémoire Java et les fuites de mémoire

Garbage Collector en Java joue un rôle clé dans les performances des applications et l'utilisation de la mémoire. Il recherche les objets inutilisés (morts) et les supprime. Ces objets n'occupent plus de mémoire, votre application continue donc d'assurer la disponibilité des ressources. Parfois, l'application ne donne pas au GC suffisamment de temps ou de ressources pour supprimer les objets morts et ceux-ci s'accumulent. Vous pouvez rencontrer une situation dans laquelle il existe un accès actif à des objets que vous pensez morts. Le ramasse-miettes ne peut rien y faire parce que... son mécanisme de gestion automatisé de la mémoire contourne les objets actifs. Généralement, le garbage collector fonctionne de manière autonome, mais vous devez ajuster son comportement pour répondre à de graves problèmes de mémoire. Cependant, GC lui-même peut entraîner des problèmes de performances.

Domaines du GC

Le garbage collector sépare les objets en différentes zones pour optimiser l'assemblage. Young Generation présente des objets qui disparaissent rapidement. L'éboueur intervient souvent dans cette zone à partir du moment où il doit nettoyer. Les objets qui restent vivants après avoir atteint une certaine période sont transférés vers l'ancienne génération. Dans le quartier Ancienne Génération, les objets restent longtemps et ne sont pas aussi souvent retirés par le collectionneur. Cependant, lorsque le collecteur s'exécute dans la portée, l'application effectue une opération de grande envergure au cours de laquelle le collecteur examine les objets actifs pour nettoyer les déchets. De ce fait, les objets applicatifs se situent dans la zone de génération permanente finale. En règle générale, ces objets incluent les métadonnées JVM nécessaires. L'application ne génère pas beaucoup de déchets dans la génération permanente, mais a besoin d'un collecteur pour supprimer les classes lorsque celles-ci ne sont plus nécessaires.

Relation entre le Garbage Collector et le temps de réponse

Le garbage collector, quelle que soit la priorité d'exécution des threads d'application, les arrête sans attendre la fin. Ce phénomène est appelé événement « Stop the World ». La région Young Generation du garbage collector a un impact mineur sur les performances, mais des problèmes sont visibles si le GC effectue un nettoyage intensif. Vous vous retrouvez dans une situation où le GC mineur de la jeune génération est constamment en cours d'exécution ou où l'ancienne génération entre dans un état incontrôlé. Dans une telle situation, vous devez équilibrer la fréquence de la jeune génération avec les performances, ce qui nécessite d'augmenter la taille de cette zone de collecteur. Les régions de génération permanente et d'ancienne génération du garbage collector ont un impact significatif sur les performances des applications et l'utilisation de la mémoire. Cette opération majeure de nettoyage des déchets passe par le tas pour expulser les objets morts. Le processus prend plus de temps qu’une version mineure et l’impact sur les performances peut prendre plus de temps. Lorsque l'intensité du lavage est élevée et que la taille de la zone d'ancienne génération est grande, les performances de l'ensemble de l'application sont ralenties en raison des événements « Stop the world ». L'optimisation du garbage collection nécessite de surveiller la fréquence d'exécution d'un programme, l'impact sur les performances globales et la manière d'ajuster les paramètres de l'application pour réduire la fréquence de surveillance. Vous devrez peut-être identifier le même objet placé plusieurs fois sans que l'application ait à se séparer du placement, ou vous devrez peut-être trouver les points de compression qui retiennent l'ensemble du système. Pour trouver le bon équilibre, il faut prêter une attention particulière à tout, de la charge du processeur aux cycles de votre ramasse-miettes, surtout si les jeunes et les anciennes générations sont déséquilibrées. La résolution des fuites de mémoire et l'optimisation du garbage collection contribuent à améliorer les performances d'une application Java. Vous jonglez littéralement avec de nombreuses pièces mobiles. Mais avec la bonne approche de dépannage et des outils d’analyse conçus pour offrir une visibilité rigoureuse, vous atteindrez la lumière au bout du tunnel. Sinon, vous souffrirez de problèmes liés aux performances. Un placement et une surveillance minutieux de la mémoire jouent un rôle essentiel dans une application Java. Vous devez prendre le contrôle total de l'interaction entre le garbage collection, la suppression des objets et les performances pour optimiser votre application et éviter les erreurs de mémoire insuffisante. Les outils de surveillance vous aident à rester informé des problèmes potentiels et à mettre en évidence les tendances d'utilisation de la mémoire afin que vous adoptiez une approche proactive du dépannage. Les fuites de mémoire montrent souvent l'inefficacité du dépannage de la manière habituelle, surtout si vous rencontrez des valeurs de paramètres de configuration incorrectes, mais la résolution des problèmes liés à la mémoire peut vous aider à éviter rapidement les incidents qui vous gênent. La perfection du réglage de la mémoire Java et du GC facilite grandement votre processus de développement.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION