Donc, je regarde un tas avec jmap sur une boîte distante et je veux forcer le ramassage des ordures dessus. Comment faire cela sans entrer dans jvisualvm ou jconsole et ses amis?
Je sais que vous ne devriez pas avoir l'habitude de forcer le ramassage des ordures - vous devriez simplement comprendre pourquoi le tas est grand / grandit.
Je me rends également compte que System.GC () ne force pas réellement le garbage collection - il indique simplement au GC que vous souhaitez que cela se produise.
Cela dit, y a-t-il un moyen de le faire facilement? Une application de ligne de commande qui me manque?
java
garbage-collection
jmx
jmap
Eyberg
la source
la source
Réponses:
Vous pouvez le faire via le programme gratuit jmxterm .
Allumez-le comme ceci:
De là, vous pouvez vous connecter à un hôte et déclencher GC:
Consultez la documentation sur le site Web de jmxterm pour obtenir des informations sur l'incorporation de ceci dans bash / perl / ruby / autres scripts. J'ai utilisé popen2 en Python ou open3 en Perl pour ce faire.
MISE À JOUR: voici un one-liner utilisant jmxterm:
la source
Depuis JDK 7, vous pouvez utiliser l'outil de commande JDK 'jcmd' tel que:
jcmd <pid> GC.run
la source
Explicit GC is disabled, no GC has been performed
cela peut être dû à l'-XX:+DisableExplicitGC
argument VM. Voir: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Si vous exécutez
jmap -histo:live <pid>
, cela forcera un GC complet sur le tas avant d'imprimer quoi que ce soit.la source
jcmd
est maintenant le bon outil pour le travail.Ajout à la réponse de user3198490 . L'exécution de cette commande peut vous donner le message d'erreur suivant:
Cela peut être résolu à l'aide de cette réponse stackoverflow
où
<process_owner>
est l'utilisateur qui exécute le processus avec PID<pid>
. Vous pouvez obtenir les deux depuistop
ouhtop
la source
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, pourriez-vous essayer? La commande devrait être sûreIl y a quelques autres solutions (beaucoup de bonnes ici déjà):
gc()
.gc()
opération sur le MemoryMBeanL'exemple suivant concerne le cmdline-jmxclient:
C'est bien car ce n'est qu'une ligne et vous pouvez la mettre dans un script très facilement.
la source
pour Linux:
jcmd
est fourni avec le JDK,$(pgrep java)
obtient l'ID de processus de javala source
Je ne pense pas qu'il existe une option de ligne de commande pour la même chose.
Vous devrez utiliser jvisualvm / jconsole pour la même chose.
Je vous suggère plutôt d'utiliser ces outils pour identifier, pourquoi votre programme est riche en mémoire.
Quoi qu'il en soit, vous ne devriez pas forcer GC, car cela perturberait certainement l'algorithme GC et ralentirait votre programme.
la source
Si vous utilisez jolokia avec votre application, vous pouvez déclencher un garbage collection avec cette commande:
la source
juste:
la source