Rappelez-vous ce qu'est la récupération de place en Java

La récupération de place est le processus de récupération de la mémoire d'exécution complète en détruisant les objets inutilisés.

Parfois, le programmeur peut oublier de détruire des objets inutiles et la mémoire qui leur est allouée n'est pas libérée. De plus en plus de mémoire système est consommée et finalement plus rien n'est alloué. De telles applications souffrent de « fuites de mémoire ».

Passé un certain point, il n'y a plus assez de mémoire pour créer de nouveaux objets et le programme se termine anormalement à cause de OutOfMemoryError .

La récupération de place en Java est le processus par lequel les programmes Java gèrent automatiquement la mémoire. Les programmes Java sont compilés en bytecode qui s'exécute sur la machine virtuelle Java (JVM).

Lorsque des programmes Java s'exécutent sur la JVM, des objets sont créés sur le tas, qui est la partie de la mémoire qui leur est allouée.

Lorsqu'une application Java est en cours d'exécution, de nouveaux objets y sont créés. Au final, certains objets ne sont plus nécessaires. On peut dire qu'à un instant donné, la mémoire tas se compose de deux types d'objets.

  • Live - Ces objets sont utilisés, ils sont référencés ailleurs.
  • Mort - ces objets ne sont utilisés nulle part ailleurs, il n'y a aucune référence à eux.

Le ramasse-miettes trouve ces objets inutilisés et les supprime pour libérer de la mémoire.

La récupération de place en Java est un processus automatique . Le programmeur n'a pas besoin de marquer explicitement les objets à supprimer.

Chaque JVM peut implémenter sa propre version de ramasse-miettes. Cependant, le collecteur doit se conformer à la spécification JVM standard pour traiter les objets présents dans la mémoire de tas afin de marquer ou d'identifier les objets inaccessibles et de les détruire par compactage.

Accessibilité des objets

Pour reconnaître un objet comme vivant, la présence de liens ne suffit pas. En effet, certains objets morts peuvent faire référence à d'autres objets morts. C'est pourquoi il est nécessaire que parmi toutes les références à un objet, il y en ait au moins une provenant d'un objet "vivant".

Accessibilité des objets

Les éboueurs travaillent avec le concept de GC Roots ( racines de collecte des ordures ) afin de faire la distinction entre les objets vivants et morts. Il y a des objets 100% vivants et à partir d'eux il y a des liens qui animent d'autres objets et ainsi de suite.

Exemples de telles racines :

  • Classes chargées par le chargeur de classe système.
  • Flux en direct.
  • Paramètres des méthodes en cours d'exécution et des variables locales.
  • Objets utilisés comme moniteur pour la synchronisation.
  • Objets qui sont conservés de la récupération de place dans un but précis.
  • Le ramasse-miettes parcourt l'ensemble du graphe d'objets en mémoire, en commençant par ces racines et en suivant les références à d'autres objets.

Étapes de récupération de place en Java

L'implémentation standard de la récupération de place comporte trois étapes.

1. Marquez les objets comme vivants

À ce stade, le ramasse-miettes (GC) doit identifier tous les objets vivants en mémoire en parcourant le graphe d'objets.

Lorsqu'il visite un objet, il le marque comme disponible et donc vivant. Tous les objets qui ne sont pas accessibles à partir des racines du GC sont considérés comme des candidats à la récupération de place.

2. Nettoyer les objets morts

Après la phase de balisage, l'espace mémoire est occupé par des objets vivants (visités) ou morts (non visités). La phase de nettoyage libère les fragments de mémoire qui contiennent ces objets morts.

3. Disposition compacte des objets restants en mémoire

Il n'est pas nécessaire que les objets morts qui ont été retirés lors de la phase précédente soient côte à côte. Ainsi, vous risquez d'obtenir un espace mémoire fragmenté (à moitié vide).

Mais, bien sûr, après avoir prévu cela, il est possible de compacter la mémoire au moment où le ramasse-miettes supprime les objets morts. Le reste sera situé dans un bloc contigu au début du tas.

Le processus de compactage facilite l'allocation séquentielle de mémoire pour les nouveaux objets.