web-dev-qa-db-fra.com

Comment vérifier l'utilisation d'une pile JVM en cours depuis la ligne de commande?

Puis-je vérifier l'utilisation de la machine virtuelle en train de contenir une pile JVM en cours d'exécution, je parle de l'utilisation réelle plutôt que du montant maximal alloué avec Xmx.

J'ai besoin que ce soit en ligne de commande car je n'ai pas accès à un environnement Windows, et je veux un script basé sur la valeur, l'application s'exécute sur le serveur d'applications Jetty. 

36
Paul Taylor

Vous pouvez utiliser jstat, comme: 

 jstat -gc pid

Documents complets ici: http://docs.Oracle.com/javase/7/docs/technotes/tools/share/jstat.html

52
Mark

Pour Java 8, vous pouvez utiliser la ligne de commande suivante pour obtenir l'utilisation de l'espace de mémoire en Ko:

jstat -gc <PID> | tail -n 1 | awk '{split($0,a," "); sum=a[3]+a[4]+a[6]+a[8]; print sum}'

La commande résume en gros:

  • S0U: utilisation de l'espace 0 du survivant (Ko).
  • S1U: utilisation de l'espace 1 du survivant (Ko).
  • UE: utilisation de l'espace Eden (en Ko).
  • OU: Ancienne utilisation de l'espace (Ko).

Vous pouvez également vouloir inclure le métaspace et l'utilisation de l'espace de classe compressé. Dans ce cas, vous devez ajouter un [10] et un [12] à la somme awk.

14
Till Schäfer

Si vous démarrez l'exécution avec la journalisation gc activée, vous obtenez les informations sur le fichier . Sinon, 'jmap -heap' vous donnera ce que vous voulez . Voir la page du document jmap pour plus d'informations.

Veuillez noter que jmap devrait not être utilisé dans un environnement de production, sauf en cas d'absolue nécessité, car l'outil arrête l'application pour permettre de déterminer l'utilisation réelle du segment de mémoire. Généralement, cela n'est pas souhaité dans un environnement de production.

8
Erik

Toutes les procédures à la fois. Basé sur la réponse de @Till Schäfer.

En KB ...

jstat -gc $(ps axf | egrep -i "*/bin/Java *" | egrep -v grep | awk '{print $1}') | tail -n 1 | awk '{split($0,a," "); sum=a[3]+a[4]+a[6]+a[8]+a[10]+a[12]; print sum}'

En MB ...

jstat -gc $(ps axf | egrep -i "*/bin/Java *" | egrep -v grep | awk '{print $1}') | tail -n 1 | awk '{split($0,a," "); sum=(a[3]+a[4]+a[6]+a[8]+a[10]+a[12])/1024; print sum" MB"}'

"Awk sum" référence:

 a[1] - S0C
 a[2] - S1C
 a[3] - S0U
 a[4] - S1U
 a[5] - EC
 a[6] - EU
 a[7] - OC
 a[8] - OU
 a[9] - PC
a[10] - PU
a[11] - YGC
a[12] - YGCT
a[13] - FGC
a[14] - FGCT
a[15] - GCT

Merci!

NOTE: Fonctionne pour OpenJDK!

AUTRE QUESTION: Mauvaise information?

Si vous vérifiez l'utilisation de la mémoire avec la commande ps, vous verrez que le processus Java consomme beaucoup plus ...

ps -eo size,pid,user,command --sort -size | awk '{ hr=$1/1024 ; printf("%13.2f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' |cut -d "" -f2 | cut -d "-" -f1
0
Eduardo Lucio