GC Doctor Analysez vos logs de ramasse-miettes dans le navigateur Analyser votre log GC dans GC Doctor

English

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.

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.

CMS devait démarrer son cycle concurrent assez tôt pour finir avant que la promotion remplisse la génération ancienne (il démarre à l'occupation fixée par -XX:CMSInitiatingOccupancyFraction, adaptée par défaut). Si la promotion allait plus vite que le cycle, ou si la fragmentation ne laissait aucun bloc libre assez grand pour un objet promu, la JVM écrivait concurrent mode failure et retombait sur une collecte complète séquentielle, avec des pauses de plusieurs secondes sur de grands tas.

CMS a été déprécié en JDK 9 et supprimé en JDK 14 : ce message n'apparaît donc que dans d'anciens logs. Abaisser le seuil de démarrage, agrandir le tas ou passer à G1 sont les remèdes habituels. Les collecteurs modernes ont le même échec sous d'autres noms : échec d'évacuation (G1), GC dégénéré (Shenandoah), allocation stall (ZGC).

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.

Déclencheurs typiques : plus de place pour promouvoir ou allouer après une collecte jeune (Allocation Failure), un appel explicite à System.gc(), le seuil du metaspace, une demande d'inspection ou de dump du tas, un collecteur concurrent qui a pris du retard. Le coût croît avec les données vivantes, puisqu'il faut toutes les marquer et les déplacer : des secondes sur un tas de plusieurs gigaoctets.

Serial et Parallel collectent leur génération ancienne par une collecte complète par conception. G1 utilise une collecte complète parallèle depuis JDK 10, mais elle reste un dernier recours. Le signe d'un problème, ce sont des collectes complètes fréquentes qui récupèrent peu : l'ensemble de données vivantes est proche de la taille du tas, et l'application fuit ou est sous-dimensionnée. Lisez la cause dans la ligne de log, Pause Full (cause), puis le tas après la collecte. GC Doctor liste chaque full GC avec sa cause et son tas avant et après.

Concurrent mode failure (CMS)