Comment force-t-on la collecte des déchets dans la shell?

Donc, je regarde un tas avec jmap sur une boîte distante et je veux forcer la récupération de mémoire dessus. Comment faites-vous cela sans sauter dans jvisualvm ou jconsole et amis?

Je sais que vous ne devriez pas être dans la pratique de forcer la collecte des ordures – vous devriez juste comprendre pourquoi le tas est gros / croissant.

Je me rends également compte que System.GC () ne force pas la récupération de mémoire – il indique simplement au GC que vous souhaitez qu’il se produise.

Cela dit, y a-t-il un moyen de le faire facilement? Certaines applications en ligne de commande me manquent?

Vous pouvez le faire via le programme gratuit jmxterm .

Lancez-le comme ça:

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

De là, vous pouvez vous connecter à un hôte et déclencher 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 les documents sur le site Web de jmxterm pour plus d’informations sur l’intégration de ces scripts dans bash / perl / ruby ​​/ other. J’ai utilisé popen2 en Python ou open3 en Perl pour ce faire.

UPDATE: voici un one-liner utilisant jmxterm:

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

Depuis JDK 7, vous pouvez utiliser l’outil de commande JDK «jcmd», par exemple:

jcmd GC.run

Si vous exécutez jmap -histo:live , cela forcera un GC complet sur le tas avant d’imprimer quoi que ce soit.