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

English

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.

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.

Le metaspace grandit quand des classes sont chargées et rétrécit quand leur chargeur de classes est ramassé. Par défaut il n'est limité que par la mémoire native disponible. -XX:MaxMetaspaceSize fixe un plafond, et l'atteindre lève OutOfMemoryError: Metaspace. -XX:MetaspaceSize fixe le seuil auquel la première collecte est déclenchée (cause Metadata GC Threshold dans le log).

Causes typiques de croissance : des frameworks qui génèrent des classes à l'exécution (proxys, génération de bytecode, scripts), des redéploiements qui laissent fuir des chargeurs de classes, ou une limite trop basse pour le nombre de classes. Une dent de scie avec des collectes Metadata GC Threshold signifie que le seuil est trop bas et que chaque augmentation déclenche une collecte complète : augmentez MetaspaceSize. Depuis JDK 16 (JEP 387), le metaspace inutilisé est rendu plus vite au système.

Documentation officielle : JEP 387: Elastic Metaspace, The java command (Oracle)

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.

Metaspace