Ramasse-miettes

Outil pédagogique interactif avec visualisation. Mark-sweep / generational GC on a toy heap: roots, marks, and frees.

À propos de cet outil

Suivre une collecte

Choisissez une collecte complète ou une collecte jeune uniquement, un tas et un objet racine ou aucune racine. Préparer le tas crée la chronologie immuable complète et affiche l’étape 0. La racine sélectionnée est conservée. Dans le préréglage aléatoire, choisissez 8–32 objets et une graine entière de 0 à 4294967295. Le nombre et la graine ne servent pas pour le tas fixe à deux cycles.

Utilisez le champ d’étape exact, le curseur de chronologie, Précédent, Suivant, Début ou Fin pour inspecter les mêmes instantanés. La lecture avance à 1, 3 ou 10 étapes par seconde réelle et s’arrête à la fin ; lire depuis la fin recommence à l’étape 0. La navigation manuelle et le changement de vitesse mettent la lecture en pause. Une vue masquée fige son étape et ne reprend que si elle était en lecture.

Collecte complète

Les racines amorcent une liste de travail FIFO. Chaque étape de marquage visite un objet, le marque, et met en file les cibles éligibles non visitées. Lorsque la liste de travail est vide, le balayage examine chaque objet, conserve les objets marqués et libère les objets non marqués. Un cycle de références inatteignable est donc collecté même si ses membres se référencent mutuellement.

Collecte jeune uniquement, conservative

Seuls les objets jeunes appartiennent à l’ensemble de collecte. Les racines jeunes et toutes les références ancien→jeune fournissent les points d’entrée. Ces arêtes mémorisées sont montrées comme des références dirigées en tirets et listées explicitement. Le parcours reste dans les objets jeunes. Les objets anciens sont toujours retenus, y compris les objets anciens globalement inatteignables ; leurs cibles jeunes peuvent donc aussi survivre de façon conservative.

Le balayage ne libère que les objets jeunes non marqués. Une étape de promotion distincte fait passer à ancien tout objet jeune survivant. Cette règle volontairement simplifiée à une seule survie n’est pas une politique de vieillissement JVM ou CLR. La liste exacte des arêtes ancien→jeune n’est ici ni une approximation de card-table, ni une reproduction de G1.

Exemples de tas

Le tas fixe a huit objets et les références 0→1, 1→2, 2→1, 3→4, 4→5 et 5→4. Les objets 6 et 7 n’ont pas de références sortantes. Les objets 0, 3 et 7 sont anciens ; les autres sont jeunes. Une collecte complète enracinée en 0 ne conserve que 0, 1 et 2. Sans racines, elle libère tout. Une collecte jeune uniquement enracinée en 0, ou sans racines, retient 0, 1, 2, 3, 4, 5 et 7 et libère 6 : les arêtes 0→1 et 3→4 protègent les deux cycles jeunes.

Le tas aléatoire utilise le générateur déterministe mulberry32. Chaque objet a jusqu’à deux références cibles aléatoires distinctes, y compris d’éventuelles auto-références. Les ID divisibles par 3 sont anciens, les autres jeunes. La même graine et les mêmes réglages reproduisent le même tas et la même chronologie.

Lire le graphe

Les cercles avec Y désignent les objets jeunes ; les carrés avec O désignent les objets anciens. R identifie une racine, un anneau en tirets signifie en file, et un anneau extérieur plein identifie l’objet actif. Une coche désigne marqué ; un objet barré est libéré. Les références sortantes actives sont mises en évidence. Les objets libérés et les références historiques estompées restent en place pour expliquer la collecte ; aucune compaction n’est montrée. Le tableau enregistre, pour chaque instantané, la génération réelle, les ID de références stockés et l’état. La liste de travail est affichée dans l’ordre FIFO.

Portée et coût

C’est un petit modèle pédagogique stop-the-world. Aucune allocation n’a lieu pendant une exécution, et il n’y a ni finaliseurs, ni références faibles, ni compaction, ni barrières d’écriture concurrentes. L’algorithme de collecte prend un travail O(V + E) pour V objets et E références. Conserver un instantané complet après chaque étape utilise un espace O(V² + VE) dans cette chronologie pédagogique. Ce n’est pas une affirmation sur la mémoire ou les performances d’un vrai ramasse-miettes.

Sources

Microsoft: garbage collection fundamentals et Oracle: G1 and remembered sets.

Les saisies, le tas préparé et la position dans la chronologie sont enregistrés localement. La réouverture ou le changement de langue restaure l’étape en pause, y compris les saisies invalides. Effacer le résultat retire le tas préparé et conserve les saisies.