Messages du journal Java Garbage Collection

96

J'ai configuré Java pour vider les informations de collecte des ordures dans les journaux ( GC détaillé ). Je ne suis pas sûr de la signification des entrées de ramasse-miettes dans les journaux. Un échantillon de ces entrées est publié ci-dessous. J'ai cherché sur Google et je n'ai pas trouvé d'explications solides.

J'ai quelques suppositions raisonnables, mais je cherche des réponses qui fournissent des définitions strictes de ce que signifient les chiffres dans les entrées, appuyées par des sources crédibles. Un +1 automatique à toutes les réponses qui citent la documentation du soleil. Mes questions sont:

  1. À quoi fait référence PSYoungGen? Je suppose que cela a quelque chose à voir avec la génération précédente (plus jeune?), Mais quoi exactement?
  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 pour le second?
  4. Que signifie chaque nombre (taille de mémoire) dans le triplet. Par exemple, dans 109884K-> 14201K (139904K), est la mémoire avant GC 109884k, puis elle est réduite à 14201K. Comment le troisième chiffre est-il pertinent? Pourquoi aurions-nous besoin d'un deuxième ensemble de chiffres?

8109.128: [GC [PSYoungGen: 109884K-> 14201K (139904K)] 691015K-> 595332K (1119040K), 0,0454530 s]

8112.111: [GC [PSYoungGen: 126649K-> 15528K (142336K)] 707780K-> 605892K (1121472K), 0,0934560 s]

8112.802: [GC [PSYoungGen: 130344K-> 3732K (118592K)] 720708K-> 607895K (1097728K), 0,0682690 s]

Ethan Heilman
la source
tas entier, jeune génération partie du tas, gc mineur pour le fonctionnement de gc, vérifiez par exemple cubrid.org/blog/dev-platform
...

Réponses:

90

La plupart sont expliqués dans le GC Tuning Guide (que vous feriez bien de lire de toute façon).

L'option de ligne de commande -verbose:gcentraîne l'impression des informations sur le tas et le garbage collection à chaque collection. 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]

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

Le nombre suivant entre parenthèses (par exemple, à (776768K)nouveau à partir de la première ligne) est la taille validée du tas: 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'inclut pas l'un des espaces survivants, car un seul peut être utilisé à un moment donné, et n'inclut pas non plus la génération permanente, qui contient les métadonnées utilisées par la machine virtuelle.

Le dernier élément sur la ligne (par exemple, 0.2300771 secs) indique le temps nécessaire 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:gcest sujet à changement dans les versions futures.

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

Michael Myers
la source
Où trouver les fichiers journaux gc?
Mr Lou
7
Cette réponse ne répond pas vraiment aux questions d'origine. Je pense que la réponse de Michaeljoseph est meilleure. Il répond aux questions posées par Ethan et fait un meilleur travail en décomposant l'exemple original. Bien qu'il y ait deux problèmes dans sa réponse (son lien est maintenant mort et rafa.ferreria a signalé l'autre), cela ne fait pas que régurgiter un document Oracle.
Dirk
127
  1. PSYoungGen fait référence au garbage collector utilisé pour la collecte mineure. PS signifie Parallel Scavenge.
  2. Le premier ensemble de nombres correspond aux tailles avant / après de la jeune génération et le second ensemble concerne l'ensemble du tas. ( Le diagnostic d'un problème de nettoyage de la mémoire détaille le format)
  3. Le nom indique la génération et le collecteur en question, le deuxième ensemble concerne l'ensemble du tas.

Un exemple de GC 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és avant GC, 14 Mo utilisés après GC, taille maximale de la jeune génération 137 Mo
  • 675Mb tas utilisé avant GC, 581Mb tas utilisé après GC, 1Gb taille de segment maximum
  • GC mineur s'est produit 8109,128 secondes depuis le démarrage de la machine virtuelle Java et a pris 0,04 seconde
Michaeljoseph
la source
8
juste un commentaire mineur, la valeur entre '()' n'est pas la taille maximale, pour toujours, c'est la taille maximale pour le moment. Si le GC ne pouvait pas libérer moins le tas, cette limite plus d'espace sera nécessaire pour le système opérationnel, et cette valeur augmentera. En respectant bien sûr la limite définie sur: -Xmx
rafa.ferreira
@ rafa.ferreira Je pense que la valeur en paranthesis ie 1119040K est la taille de tas engagée. Je ne pense pas, GC imprime la taille du «tas max» n'importe où. Référence 1 et référence 2
rohitmohta
23

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

-XX:+PrintGCDetails 

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

-Xloggc:gc.logSemble également générer la même sortie que -verbose:gcmais 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 ).

Veillez à bien écrire les paramètres, j'ai oublié le "+" et mon JBoss ne démarre pas, sans aucun message d'erreur!

Andrei
la source
3
Notez que gc.log sera écrasé au redémarrage de java (par exemple, si vous redémarrez votre tomcat car il avait des problèmes de mémoire, et vous aimeriez voir ce gc.log). Ou du moins si vous faites pivoter les journaux GC. Il existe de nombreuses autres options contrôlant la journalisation gc. Voir oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html . En particulier, considérez-XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<some number of files> -XX:GCLogFileSize=<some size> -XX:+PrintTenuringDistribution
Dan Pritts