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:
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]
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?
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]
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!