Problèmes GC courants
Les problèmes qui se voient dans les logs de ramasse-miettes : ce qu'ils signifient, comment ils apparaissent dans un log et quoi regarder ensuite.
Java
Pause / Stop-the-world
Période pendant laquelle tous les threads de l'application sont arrêtés pour que le collecteur travaille sur un tas qui ne bouge pas sous ses pieds.
Full GC
Collecte stop-the-world de tout le tas : marquage puis compactage. La collecte la plus lente ; dans une application saine elle est rare ou absente.
Objet humongous (G1)
Dans G1, objet dont la taille atteint au moins la moitié d'une région. Il est alloué directement dans des régions anciennes contiguës et évite la génération jeune.
Échec d'évacuation / to-space exhausted (G1)
G1 n'a pas pu copier un objet vivant faute de région libre pour le recevoir. Le log affiche to-space exhausted.
Concurrent mode failure (CMS)
CMS uniquement. La génération ancienne s'est remplie avant la fin du cycle concurrent, si bien que la JVM a arrêté l'application et lancé une collecte complète avec compactage.
GC overhead limit exceeded
Une OutOfMemoryError levée quand la JVM passe presque tout son temps en GC et ne récupère presque rien.
GC explicite (System.gc())
Collecte demandée par du code ou un outil plutôt que par le collecteur lui-même, avec la cause System.gc() ou Diagnostic Command.
Metaspace
Mémoire native, hors du tas Java, qui contient les métadonnées des classes chargées : structures, méthodes et pools de constantes. Il a remplacé la génération permanente en JDK 8.
Go
Mark assist
Travail de marquage fait par une goroutine qui alloue, quand le programme alloue plus vite que les workers d'arrière-plan ne marquent.
Limiteur de CPU du GC
Garde-fou ajouté en Go 1.19 qui plafonne le temps CPU que le collecteur peut prendre, autour de 50 pour cent, quand la limite mémoire est atteinte.
.NET
Tas des gros objets (LOH)
Zone séparée pour les objets de 85 000 octets ou plus. Elle n'est collectée qu'avec la génération 2.
Suspension du GC
Avant la plupart des collectes, le runtime doit suspendre tous les threads managés. Le temps que cela prend est le temps de suspension.