Outil de ligne de commande pour trouver la Taille du tas Java et la mémoire utilisée (Linux)?
Existe-t-il un outil de ligne de commande (Linux) pour vérifier la Taille du tas (et la mémoire utilisée) d'une application Java?
J'ai essayé jmap. Mais ça donne des infos. à propos des zones de mémoire interne comme Eden / PermGen, etc. qui n'est pas utile pour moi.
Je cherche quelque chose comme:
Max Mémoire: 1 Gb
Mémoire minimale: 256 Mo
Mémoire de tas: 700 Mo
Mémoire utilisée: 460 Mo
C'est tout. Je sais que je peux voir cela dans JConsole etc. mais j'ai besoin d'un outil de ligne de commande (pas de activer JMX etc.)
Un tel outil/commande?
13 answers
Chaque processus Java a un pid
, que vous devez d'abord trouver avec la commande jps
.
Une fois que vous avez le pid, vous pouvez utiliser jstat -gc [insert-pid-here]
pour trouver des statistiques du comportement du tas de déchets collectés.
jstat -gccapacity [insert-pid-here]
présentera des informations sur la génération de pool de mémoire et les capacités spatiales.jstat -gcutil [insert-pid-here]
présentera l'utilisation de chaque génération, comme un pourcentage de sa capacité. Très utile pour avoir une en un coup d'œil vue de l'utilisation.
Voir jstat docs sur Oracle du site.
Jvmtop est un outil en ligne de commande qui fournit une vue en direct à plusieurs métriques, y compris le tas.
Exemple de sortie du mode aperçu de la machine virtuelle:
JvmTop 0.3 alpha (expect bugs) amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
Cette commande affiche les tailles de tas configurées en octets.
java -XX:+PrintFlagsFinal -version | grep HeapSize
Cela fonctionne également sur Amazon AMI sur EC2.
Essayez cela cela a fonctionné dans Ubuntu et RedHat:
java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'
Pour Windows:
java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"
Pour Mac
java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
La sortie de toutes ces commandes ressemble à la sortie ci-dessous:
uintx InitialHeapSize := 20655360 {product}
uintx MaxHeapSize := 331350016 {product}
uintx PermSize = 21757952 {pd product}
uintx MaxPermSize = 85983232 {pd product}
intx ThreadStackSize = 1024 {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
Pour trouver la taille en Mo, divisez la valeur avec (1024*1024).
Sans utiliser JMX, ce que la plupart des outils utilisent, tout ce que vous pouvez faire est d'utiliser
jps -lvm
Et en déduire que les paramètres seront à partir des options de ligne de commande.
Vous ne pouvez pas obtenir d'informations dynamiques sans JMX par défaut mais vous pouvez écrire votre propre service pour ce faire.
BTW: Je préfère utiliser VisualVM plutôt que JConsole.
Il existe un outil en ligne de commande avec un aspect visuel - jvm-mon. C'est un outil de surveillance JVM pour la ligne de commande qui disaplys:
- utilisation du tas, taille et max
- processus jvm
- utilisation du processeur et du GC
- fils supérieurs
Les métriques et les graphiques sont mis à jour lorsque l'outil est ouvert.
En retard à la fête, mais une solution très simple consiste à utiliser le jpsstat.sh script. Il fournit une simple mémoire active , max mémoire et cpu utiliser détails.
- Le projet GitHub a été créé en 1999 et a été développé en 1999. jpsstat.sh fichier
- cliquez-Droit sur jpsstat.sh et goto autorisations onglet et de le rendre exécutable
- Exécutez maintenant le script en utilisant la commande suivante ./jpsstat.sh
Voici l'exemple de sortie du script -
===== ====== ======= ======= =====
PID Name CurHeap MaxHeap %_CPU
===== ====== ======= ======= =====
2777 Test3 1.26 1.26 5.8
2582 Test1 2.52 2.52 8.3
2562 Test2 2.52 2.52 6.4
En termes de taille de tas Java, sous Linux, vous pouvez utiliser
ps aux | grep java
Ou
ps -ef | grep java
Et recherchez-Xms, -Xmx pour connaître la taille initiale et maximale du tas spécifiée.
Cependant, si-Xms ou-Xmx est absent pour le processus Java qui vous intéresse, cela signifie que votre processus Java utilise les tailles de tas par défaut. Vous pouvez utiliser la commande suivante pour connaître les tailles par défaut.
java -XX:+PrintFlagsFinal -version | grep HeapSize
Ou une jvm particulière, par exemple,
/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize
Et recherchez InitialHeapSize et MaxHeapSize, qui est en octets.
Obtenez d'abord l'id du processus, le premier numéro du processus répertorié, à partir de l'un des éléments suivants: (ou utilisez simplement ps aux | grep java
, si vous préférez cela)
jps -lvm
Puis utilisez l'ID du processus ici:
jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID
Toute approche devrait vous donner à peu près le même nombre. C'est toujours une bonne idée d'allouer le tas en utilisant -X..m
-X..x
pour toutes les générations. Vous pouvez ensuite garantir et également faire PS pour voir quels paramètres ont été passés et donc utilisés.
Pour les utilisations réelles de la mémoire, vous pouvez comparer grossièrement VIRT (alloué et partagé) et RES (réel utilisé) par rapport aux valeurs jstat:
Pour Java 8, voir jstat pour ces valeurs signifient réellement. En supposant que vous exécutez une classe simple sans mmap ni traitement de fichiers.
$ jstat -gccapacity 32277
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2
$ jstat -gcutil 32277
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032
Max:
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
( à peu près près et en dessous de la mémoire VIRT)
Max (Min, utilisé):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(à peu près proche de la mémoire RES)
"Ne me citez pas à ce sujet" mais VIRT mem est à peu près proche ou supérieur à la mémoire maximale allouée mais tant que la mémoire utilisée est libre/disponible en mémoire physique, JVM ne lève pas d'exception de mémoire. En fait, la mémoire maximale n'est même pas vérifié par rapport à la mémoire physique au démarrage de la JVM même avec swap off sur le système d'exploitation. Une meilleure explication de la mémoire virtuelle réellement utilisée par un processus Java est discutée ici.
Si vous utilisez jrockit, essayez l'outil de ligne de commande jrcmd. Par exemple:
$ jrcmd 5127 print_memusage
5127:
Total mapped 1074596KB (reserved=3728KB)
- Java heap 786432KB (reserved=0KB)
- GC tables 26316KB
- Thread stacks 13452KB (#threads=34)
- Compiled code 9856KB (used=9761KB)
- Internal 840KB
- OS 15036KB
- Other 146632KB
- Java class data 75008KB (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking 1024KB (malloced=102KB #8)
Pour plus de commandes, comme heap_diagnostics, utilisez "jrcmd help" pour les lister.
Https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t
Utiliser top
commande est le moyen le plus simple pour vérifier l'utilisation de la mémoire du programme. RES
colonne montre la mémoire physique réelle qui est occupée par un processus.
Pour mon cas, j'avais un fichier 10g lu en java et chaque fois que je sortais de l'exception de mémoire. Cela s'est produit lorsque la valeur de la colonne RES
a atteint la valeur définie dans l'option -Xmx
. Ensuite, en augmentant la mémoire en utilisant l'option -Xmx
, tout s'est bien passé.
jstat -gccapacity javapid (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex. stat -gccapacity 28745 550 10 )
Exemple O / P de la commande ci-dessus
NGCMN NGCMX NGC S0C
87040.0 1397760.0 1327616.0 107520.0
NGCMN Minimum new generation capacity (KB).
NGCMX Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).
Obtenez plus de détails à ce sujet à http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html