CodeGym /Blog Java /Random-FR /En savoir plus sur le ramasseur de déchets
Auteur
Milan Vucic
Programming Tutor at Codementor.io

En savoir plus sur le ramasseur de déchets

Publié dans le groupe Random-FR
Salut! Dans la dernière leçon, nous nous sommes d'abord familiarisés avec le ramasse-miettes intégré de Java et avons eu une idée approximative de son fonctionnement. Il fonctionne en arrière-plan pendant que votre programme est en cours d'exécution, collectant les objets inutiles qui seront supprimés plus tard. Ainsi, il libère de la mémoire qui peut être utilisée pour créer de nouveaux objets à l'avenir.
En savoir plus sur le ramasse-miettes - 1
Dans cette leçon, nous verrons plus en détail comment cela fonctionne. Par exemple, comment et quand un objet devient-il inutile ? Et comment l'éboueur le découvre-t-il ? Ce sont des questions auxquelles nous répondrons pendant la leçon d'aujourd'hui :) La leçon ressemblera plus à un aperçu : vous n'avez pas besoin d'apprendre ce matériel par cœur. L'intention est principalement d'élargir votre vision du fonctionnement de la mémoire et du ramasse-miettes, alors lisez simplement et trouvez quelque chose de nouveau pour vous-même :) C'est parti ! La première chose que vous devez retenir est que le ramasse-miettes fonctionne en parallèle avec votre programme. Cela ne fait pas partie de votre programme. Il fonctionne séparément (dans la dernière leçon, nous l'avons comparé à un robot aspirateur) Mais il n'en a pas toujours été ainsi. La récupération de place était effectuée sur le même thread que votre programme. Selon un calendrier (une fois toutes les quelques minutes), le ramasse-miettes vérifiait la présence d'objets indésirables dans le programme. Le problème était que le programme se bloquait (ne s'exécutait pas) pendant cette vérification et ce ramasse-miettes. Imaginez que vous êtes assis dans votre bureau au travail. Mais ensuite, la femme de ménage entre pour laver les sols. Elle vous éloigne de votre ordinateur pendant 5 minutes et vous attendez qu'elle ait fini de nettoyer. Pendant ce temps, vous ne pouvez pas travailler. C'est à peu près comme ça que le ramasse-miettes fonctionnait :) Ce mécanisme a été modifié plus tard, et maintenant le ramasse-miettes fonctionne en arrière-plan, ne pas entraver le travail du programme lui-même. Vous savez déjà qu'un objet meurt lorsqu'il n'a plus de références. En réalité,le ramasse-miettes ne compte pas les références d'objet . Tout d'abord, cela pourrait prendre beaucoup de temps. Deuxièmement, ce n'est pas très efficace. Après tout, les objets peuvent se référer les uns aux autres ! En savoir plus sur le ramasse-miettes - 2La figure montre un exemple où 3 objets se réfèrent les uns aux autres, mais personne d'autre ne s'y réfère. En d'autres termes, le reste du programme n'en a pas besoin. Si le ramasse-miettes comptait simplement les références, ces 3 objets ne seraient pas collectés et la mémoire ne serait pas libérée (il y a des références à eux !). Nous pouvons comparer cela à un vaisseau spatial. Pendant le vol, les astronautes décident de vérifier la liste des pièces de rechange disponibles pour les réparations. Entre autres choses, ils trouvent un volant et des pédales d'une voiture ordinaire. De toute évidence, ils ne sont pas nécessaires ici et prennent inutilement de la place (bien que ces deux parties soient liées l'une à l'autre et aient certaines fonctions). Mais à l'intérieur du vaisseau spatial, ce sont des déchets inutiles qui doivent être jetés. En conséquence, en Java, la décision a été prise de collecter les déchets non pas sur la base du comptage de références,joignable et inaccessible . Comment déterminer si un objet est accessible ? C'est tout simplement ingénieux. Un objet est accessible s'il est référencé par un autre objet accessible. Ainsi, nous obtenons une "chaîne d'accessibilité". Il démarre au démarrage du programme et continue pendant toute la durée du programme. Cela ressemble à ceci : En savoir plus sur le ramasse-miettes - 3 La flèche dans la figure indique le code exécutable de notre programme. Le code (par exemple, la main()méthode) crée des références aux objets. Ces objets peuvent faire référence à d'autres objets, ces objets à d'autres encore, et ainsi de suite. Cela forme une chaîne de référence. Si vous pouvez suivre la chaîne d'un objet à la "référence racine" (celle créée directement dans le code exécutable), alors il est considéré comme accessible. Ces objets sont marqués en noir sur l'image. Mais un objet est inaccessible si l'objet sort de cette chaîne, c'est-à-dire qu'aucune des variables du code en cours d'exécution ne le référence, et qu'il ne peut pas être atteint via la "chaîne de référence". Dans notre programme, deux de ces objets sont marqués en rouge. Notez que ces objets "rouges" ont des références les uns aux autres. Mais comme nous l'avons dit plus tôt, le ramasse-miettes moderne de Java ne compte pas les références. Il détermine si un objet est accessible ou inaccessible. En conséquence, il saisira les deux objets rouges de la figure. Examinons maintenant l'ensemble du processus du début à la fin. Ce faisant, nous verrons également comment la mémoire est organisée en Java :) Tous les objets Java sont stockés dans une zone spéciale de la mémoire appelée heap . Dans le langage courant, un tas est généralement une montagne d'objets, où tout est mélangé. Mais ce n'est pas ce qu'est le tas en Java. Sa structure est très logique et raisonnable. À un moment donné, les programmeurs Java ont découvert que tous leurs objets pouvaient être divisés en deux types : les objets simples et les "objets à longue durée de vie".. Les "objets à longue durée de vie" sont des objets qui ont survécu à de nombreux cycles de collecte des ordures. Ils vivent généralement jusqu'à la fin du programme. Au final, le tas complet, où tous les objets sont stockés, a été divisé en plusieurs parties. La première partie a un beau nom : eden(tiré du "Jardin d'Eden" biblique). Ce nom est approprié, car c'est là que les objets se retrouvent après leur création. C'est la partie de la mémoire où de nouveaux objets sont créés lorsque nous utilisons le mot-clé new. De nombreux objets peuvent être créés. Lorsque cette zone est à court d'espace, un premier ramasse-miettes "rapide" commence. Il faut dire que le ramasse-miettes est très malin. Il choisit un algorithme selon que le tas contient plus de déchets ou plus d'objets actifs. Si presque tous les objets sont des ordures, le collecteur marque les objets actifs et les déplace vers une autre zone de mémoire. Ensuite, la zone actuelle est complètement effacée. S'il n'y a pas beaucoup de déchets et que le tas est principalement constitué d'objets vivants, le collecteur marque les déchets, les efface et regroupe les autres objets. Nous l'avons dit "un espace de survie . Un espace de survie , quant à lui, est divisé en générations . Chaque objet appartient à une génération particulière, en fonction du nombre de cycles de récupération de place auxquels il a survécu. Si un objet a survécu à une ronde de ramasse-miettes, alors il se trouve dans la "Génération 1" ; si 5, alors "Génération 5". Ensemble, l'eden et un espace de survie forment un espace appelé la jeune génération . En plus de la jeune génération, le tas a un autre espace de mémoire appelé l' ancienne génération. C'est précisément la zone où finissent les objets à longue durée de vie qui ont survécu à de nombreux cycles de collecte des ordures. Il y a des avantages à les séparer de tous les autres. Le ramasse-miettes complet n'est effectué que lorsque l'ancienne génération est pleine, c'est-à-dire qu'il y a tellement d'objets à longue durée de vie dans le programme qu'il n'y a pas assez de mémoire. Ce processus implique plus d'une zone de mémoire. En général, il s'agit de tous les objets créés par la machine Java. Naturellement, cela prend beaucoup plus de temps et de ressources. C'est précisément la décision qui a été prise de stocker séparément les objets à longue durée de vie. Une "collecte rapide des ordures" est effectuée lorsque d'autres zones manquent d'espace. Cela ne concerne qu'un seul domaine, ce qui le rend plus rapide et plus efficace. Enfin, lorsque même la zone des objets à longue durée de vie est complètement remplie, la récupération complète de la mémoire est déclenchée. Ainsi, le collecteur n'utilise l'outil "le plus lourd" que lorsqu'il est impossible de l'éviter. Voici une représentation visuelle de la structure du tas et de la récupération de place : En savoir plus sur le ramasse-miettes - 4
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION