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