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

English

É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.

G1 n'a pas pu copier un objet vivant faute de région libre pour le recevoir. Le log affiche to-space exhausted.

Pendant une collecte jeune ou mixte, G1 copie (évacue) les objets vivants vers des régions libres. S'il en manque, il ne peut pas tout déplacer : il laisse sur place les objets qu'il n'a pas pu copier, termine la pause en réparant les références et conserve ces régions. Une telle pause est bien plus longue que d'habitude, et une collecte complète suit souvent, la plus lente de toutes.

Causes : trop peu de tas libre au début de la collecte (le cycle concurrent a démarré trop tard, le débit d'allocation est élevé, beaucoup d'objets humongous), ou un tas trop petit pour les données vivantes. Remèdes : agrandir le tas, abaisser -XX:InitiatingHeapOccupancyPercent ou laisser l'IHOP adaptatif activé pour que le cycle concurrent démarre plus tôt, augmenter -XX:G1ReservePercent (10 par défaut) et réduire les allocations humongous.

Documentation officielle : Garbage-First (G1) Garbage Collector (Oracle), Garbage-First Garbage Collector Tuning (Oracle)

Promotion / Vieillissement

Déplacement d'un objet de la génération jeune vers l'ancienne, parce qu'il a survécu à assez de collectes jeunes ou parce que l'espace survivor était plein.

Chaque survivant d'une collecte jeune prend un an. Le seuil de vieillissement (-XX:MaxTenuringThreshold, 15 par défaut) est l'âge à partir duquel les objets sont promus. Parallel et G1 l'abaissent dynamiquement pour que les survivants tiennent dans l'espace survivor. S'ils n'y tiennent pas, l'excédent est promu quel que soit son âge : c'est la promotion prématurée.

La promotion a deux coûts. L'objet est copié une fois de plus, et il mourra désormais dans la génération ancienne, où une collecte plus coûteuse le récupérera. Un volume promu élevé par rapport au débit d'allocation, ou des collectes anciennes qui récupèrent beaucoup, suggèrent une génération jeune trop petite ou des survivants trop gros. GC Doctor trace les octets promus par chaque collecte.

Ensemble mémorisé

Structure qui enregistre quelles parties du tas contiennent des références vers une zone donnée, pour pouvoir collecter cette zone sans parcourir tout le reste.

Un collecteur générationnel ne peut collecter la génération jeune seule que s'il connaît tous les objets anciens qui pointent vers elle. Au lieu de parcourir la génération ancienne, il consulte l'ensemble mémorisé (une table de cartes dans Serial et Parallel, un ensemble par région dans G1) que la barrière d'écriture entretient.

Dans G1, les ensembles mémorisés permettent aussi de collecter n'importe quel sous-ensemble de régions anciennes, ce qui rend les collectes mixtes possibles. Ils sont le principal surcoût mémoire de G1 (quelques pour cent du tas, davantage avec beaucoup de références entre régions), et leur parcours prend du temps dans chaque pause (Scan Heap Roots). Leur reconstruction est une phase concurrente après le marquage (Concurrent Rebuild Remembered Sets).

Échec d'évacuation / to-space exhausted (G1)