web-dev-qa-db-fra.com

Java Messages du journal de la récupération de place

J'ai configuré Java pour vider les informations de la récupération de place dans les journaux ( GC détaillé ). Je ne sais pas ce que signifient les entrées de la récupération de place dans les journaux. Un exemple de Ces entrées sont publiées ci-dessous. J'ai effectué une recherche sur Google et je n'ai pas trouvé d'explications solides.

J'ai des hypothèses raisonnables, mais je cherche des réponses qui fournissent des définitions strictes de la signification des chiffres dans les entrées, étayées par des sources crédibles. Un +1 automatique à toutes les réponses citant la documentation de Sun. Mes questions sont:

  1. À quoi PSYoungGen fait-il référence? Je suppose que cela a quelque chose à voir avec la génération précédente (plus jeune?), Mais quoi au juste?
  2. Quelle est la différence entre le deuxième triplet de nombres et le premier?
  3. Pourquoi un nom (PSYoungGen) est-il spécifié pour le premier triplet de nombres mais pas le second?
  4. Que signifie chaque nombre (taille de la mémoire) dans le triplet. Par exemple, dans 109884K-> 14201K (139904K), la mémoire avant GC 109884k est réduite à 14201K. Comment le troisième numéro est-il pertinent? Pourquoi aurions-nous besoin d'une deuxième série de chiffres?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0.0454530 secondes]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0.0934560 secondes]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0.0682690 secondes]

94
Ethan Heilman

La majeure partie est expliquée dans le Guide de réglage du GC (que vous feriez bien de lire de toute façon).

L'option de ligne de commande -verbose:gc provoque l’impression d’informations sur le tas et la récupération de place à chaque collecte. Par exemple, voici la sortie d’une grande application serveur:

[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]

Nous voyons ici deux collections mineures suivies d'une collection majeure. Les nombres avant et après la flèche (par exemple, 325407K->83000K à partir de la première ligne) indiquent la taille combinée des objets vivants avant et après la récupération de place, respectivement. Après des collectes mineures, la taille inclut certains objets qui sont des ordures (ne sont plus en vie) mais qui ne peuvent pas être récupérés. Ces objets sont soit contenus dans la génération permanente, soit référencés à partir des générations permanentes ou permanentes.

Le nombre suivant entre parenthèses (par exemple, (776768K) à nouveau à partir de la première ligne) est la taille engagée du segment de mémoire: la quantité d’espace utilisable pour les objets Java sans demander plus de mémoire au système d’exploitation. Notez que ce nombre n'en inclut pas un. des espaces survivants, puisqu'un seul peut être utilisé à tout moment, et n'inclut pas la génération permanente, qui contient les métadonnées utilisées par la machine virtuelle.

Le dernier élément de la ligne (par exemple, 0.2300771 secs) indique le temps pris pour effectuer la collecte; dans ce cas, environ un quart de seconde.

Le format de la collection principale de la troisième ligne est similaire.

Le format de la sortie produite par -verbose:gc est susceptible de changer dans les prochaines versions.

Je ne sais pas pourquoi il y a un PSYoungGen dans le vôtre; avez-vous changé le ramasse-miettes?

90
Michael Myers
  1. PSYoungGen fait référence au ramasse-miettes utilisé pour la collecte mineure. PS est synonyme de récupération parallèle.
  2. Le premier ensemble de nombres correspond aux tailles avant/après de la jeune génération et le second ensemble concerne le tas entier. ( Diagnostiquer un problème de garbage collection détaille le format)
  3. Le nom indique la génération et le collecteur en question, le deuxième ensemble concerne le tas entier.

Un exemple de CPG complet associé montre également les collecteurs utilisés pour les générations anciennes et permanentes:

3.757: [Full GC [PSYoungGen: 2672K->0K(35584K)] 
            [ParOldGen: 3225K->5735K(43712K)] 5898K->5735K(79296K) 
            [PSPermGen: 13533K->13516K(27584K)], 0.0860402 secs]

Enfin, décomposez une ligne de votre exemple de sortie de journal:

8109.128: [GC [PSYoungGen: 109884K->14201K(139904K)] 691015K->595332K(1119040K), 0.0454530 secs]
  • 107 Mo utilisé avant la GC, 14 Mo utilisé après la GC, taille maximale de la jeune génération 137Mb
  • 675Mb segment de mémoire utilisé avant GC, 581Mb segment de mémoire utilisé après GC, 1 Go taille maximale du tas
  • une GC mineure s'est produite 8109.128 secondes depuis le début de la machine virtuelle Java et a pris à 0,04 secondes
127
michaeljoseph

Je voulais juste mentionner que l’on peut obtenir le journal détaillé du GC avec le

-XX:+PrintGCDetails 

paramètre. Ensuite, vous voyez la sortie de PSYoungGen ou PSPermGen comme dans la réponse.

Aussi -Xloggc:gc.log semble générer le même résultat que -verbose:gc mais vous pouvez spécifier un fichier de sortie dans le premier.

Exemple d'utilisation:

Java -Xloggc:./memory.log -XX:+PrintGCDetails Memory

Pour mieux visualiser les données, vous pouvez essayer gcviewer (une version plus récente est disponible sur github ).

Prenez soin d’écrire les paramètres correctement, j’ai oublié le "+" et mon JBoss ne pourrait pas démarrer sans message d’erreur!

23
Andrei