138 votes

Comment forcer le Garbage Collection à partir du Shell ?

Je regarde donc un tas avec jmap sur une machine distante et je veux forcer le ramassage des ordures sur ce tas. Comment faire sans aller dans jvisualvm ou jconsole et ses amis ?

Je sais que vous ne devriez pas forcer le ramassage des ordures -- vous devriez juste comprendre pourquoi le tas est grand/grandissant.

Je sais également que System.GC() ne force pas réellement le ramassage des ordures, mais indique simplement au GC que vous souhaitez qu'il se produise.

Cela dit, existe-t-il un moyen de le faire facilement ? Une application en ligne de commande qui m'échappe ?

405voto

user3198490 Points 201

Depuis JDK 7, vous pouvez utiliser l'outil de commande JDK 'jcmd' tel que :

jcmd <pid> GC.run

110voto

Will Hartung Points 57465

Si vous exécutez jmap -histo:live <pid> qui forcera un GC complet sur le tas avant qu'il n'imprime quoi que ce soit.

27voto

Harold L Points 3340

Vous pouvez le faire via le logiciel gratuit jmxterm programme.

Mettez-le en marche comme suit :

java -jar jmxterm-1.0-alpha-4-uber.jar

À partir de là, vous pouvez vous connecter à un hôte et déclencher le GC :

$>open host:jmxport
#Connection to host:jmxport is opened
$>bean java.lang:type=Memory
#bean is set to java.lang:type=Memory
$>run gc
#calling operation gc of mbean java.lang:type=Memory
#operation returns: 
null
$>quit
#bye

Consultez la documentation sur le site web de jmxterm pour obtenir des informations sur l'intégration dans des scripts bash/perl/ruby/autres scripts. J'ai utilisé popen2 en Python ou open3 en Perl pour ce faire.

UPDATE : Voici un exemple d'utilisation de jmxterm :

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port

22voto

Thomas Rebele Points 250

Complément à utilisateur3198490 La réponse de l'auteur de l'article est la suivante. L'exécution de cette commande peut donner lieu au message d'erreur suivant :

$ jcmd 1805 GC.run    
[16:08:01]
1805:
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
...

Ce problème peut être résolu à l'aide de cette réponse de stackoverflow

sudo -u <process_owner> jcmd <pid> GC.run

donde <process_owner> est l'utilisateur qui exécute le processus avec PID <pid> . Vous pouvez obtenir les deux auprès de top o htop

12voto

Xuejun Liu Points 91

Pour linux :

$ jcmd $(pgrep java) GC.run

jcmd est fourni avec le JDK, $(pgrep java) obtient l'ID du processus de java

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X