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é via jmap. Mais cela donne des informations. sur les zones de mémoire interne comme Eden / PermGen etc., ce qui ne m'est pas utile.
Je recherche quelque chose comme:
- Mémoire maximale: 1 Go
- 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 (impossible d'activer JMX etc.)
Connaissez-vous un tel outil / commande?
jstat
parmi les options à utiliser pour vérifier uniquement l'utilisation globale de la mémoire d'une JVM? Disons que vous démarrez la JVM avecXms=4g
etXmx=4g
et que vous voulez voir, quelle quantité de mémoire est déjà utilisée?jstat
manuel Oracle Java 8 Page :This command is experimental and unsupported
.awk 'print {$3+$4+$6+$8}'
peut imprimer l'utilisation résumée sur les colonnes jstat de Java 8ps -ef | grep java
m'a montré les arguments vm, qui dans mon cas incluaient la valeur -Xmx, qui était tout ce dont j'avais besoin.jvmtop est un outil de ligne de commande qui fournit une vue en direct à plusieurs métriques, y compris le tas.
Exemple de sortie du mode de vue d'ensemble VM:
la source
Cette commande affiche les tailles de tas configurées en octets.
Cela fonctionne également sur Amazon AMI sur EC2.
la source
Essayez ceci, cela a fonctionné dans Ubuntu et RedHat:
Pour les fenêtres:
Pour Mac
La sortie de toutes ces commandes ressemble à la sortie ci-dessous:
Pour trouver la taille en Mo, divisez la valeur par (1024 * 1024).
la source
jstat -gc <vmid>
pour exécuter des applications.Sans utiliser JMX, ce que la plupart des outils utilisent, tout ce que vous pouvez faire est d'utiliser
et déduire que les paramètres proviendront 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.
la source
Il existe un outil de ligne de commande avec un aspect visuel - jvm-mon . Il s'agit d'un outil de surveillance JVM pour la ligne de commande qui affiche:
Les métriques et les graphiques sont mis à jour lorsque l'outil est ouvert.
Échantillon:
la source
Tard à la fête, mais une solution très simple consiste à utiliser le script jpsstat.sh. Il fournit un moyen simple en direct la mémoire actuelle , mémoire max et utilisation cpu détails.
Voici l'exemple de sortie du script -
la source
Dans mon cas, j'avais besoin de vérifier les drapeaux à l'intérieur d'un conteneur de docker qui n'avait pas la plupart des utilitaires de base (ps, pstree ...)
En utilisant,
jps
j'ai obtenu le PID de la JVM en cours d'exécution (dans mon cas 1), puis avecjcmd 1 VM.flags
les indicateurs de la JVM en cours d'exécution.Cela dépend des commandes dont vous disposez, mais cela peut aider quelqu'un. :)
la source
À partir de Java8 et supérieur , vous pouvez utiliser la commande ci-dessous:
jcmd
JAVA_PROCESS_ID
GC.heap_infoVous pouvez faire référence à la somme, à la mémoire totale et utilisée à partir de la sortie.
Pour plus de détails sur la commande jcmd, visitez le lien: https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html
la source
GC.heap_info
est définitivement disponible dans OpenJDK 8 également. Peut-être seulement dans les versions récentes? J'utilise celui-ci: 8u191-b12-2ubuntu0.18.04.1Toute 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 alors 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 approximativement VIRT (alloué et partagé) et RES (réellement utilisé) aux valeurs jstat:
Pour Java 8, voir jstat pour ces valeurs signifient réellement. En supposant que vous exécutiez une classe simple sans mmap ni traitement de fichier.
Max :
(à peu près proche et inférieur à la mémoire VIRT)
Max (Min, utilisé):
(à peu près proche de la mémoire RES)
"Ne me citez pas là-dessus" 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 dans la mémoire physique, JVM ne lance pas d'exception de mémoire. En fait, la mémoire maximale n'est même pas vérifiée par rapport à la mémoire physique au démarrage de la JVM, même avec la permutation sur le système d'exploitation. Une meilleure explication de la mémoire virtuelle réellement utilisée par un processus Java est présentée ici .
la source
Commencez par obtenir l'identifiant 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)Utilisez ensuite l'ID de processus ici:
la source
L'utilisation de la
top
commande est le moyen le plus simple de vérifier l'utilisation de la mémoire du programme.RES
La colonne montre la mémoire physique réelle occupée par un processus.Pour mon cas, j'avais un fichier 10g lu en java et chaque fois que je sortais d'exception outOfMemory. Cela se produit lorsque la valeur de la
RES
colonne atteint la valeur définie dans-Xmx
option. Ensuite, en augmentant la mémoire en utilisant l'-Xmx
option, tout s'est bien passé.la source
En termes de taille de tas Java, sous Linux, vous pouvez utiliser
ou
et recherchez -Xms, -Xmx pour connaître la taille de tas initiale et maximale 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.
ou une jvm particulière, par exemple,
et recherchez InitialHeapSize et MaxHeapSize, qui sont en octets.
la source
Si vous utilisez jrockit, essayez l'outil de ligne de commande jrcmd. Par exemple:
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
la source
Exemple d'O / P de la commande ci-dessus
Obtenez plus de détails à ce sujet sur http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
la source
Il n'y a pas d'outil de ce type jusqu'à présent pour imprimer la mémoire du tas dans le format que vous avez demandé Le seul et unique moyen d'imprimer est d'écrire un programme java à l'aide de Runtime Class ,
}
référence: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-using-java-runtime/
la source
Trouvez l'ID de processus de votre processus webapp / java en haut. Utilisez le tas jmap pour obtenir l'allocation du tas. J'ai testé cela sur AWS-Ec2 pour le haricot élastique
Vous pouvez voir dans l'image ci-dessous 3 Go de tas maximum pour l'application
la source