Так что я смотрю на кучу с jmap на удаленном боксе и хочу навязать ему сборку мусора. Как вы можете сделать это, не заходя в jvisualvm или jconsole и друзей?
Я знаю, что вы не должны практиковать принудительный сбор мусора - вы просто должны выяснить, почему куча большая / растет.
I также реализовать систему. GC () на самом деле не вызывает сборку мусора - он просто сообщает GC, что вы хотели бы, чтобы это произошло.
Сказав, что есть способ сделать это легко? Мне не хватает приложения из командной строки?
Это можно сделать с помощью бесплатной программы jmxterm .
Запустите его так:
java -jar jmxterm-1.0-alpha-4-uber.jar
Оттуда вы можете подключиться к хосту и запустить сборщик мусора:
$>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
Посмотрите документацию на веб-сайте jmxterm для получения информации о встраивании этого в bash / perl / ruby / other скрипты. Для этого я использовал popen2 в Python или open3 в Perl.
ОБНОВЛЕНИЕ: здесь однострочное письмо с использованием jmxterm:
echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port
Я не думаю, что для этого есть какой-либо параметр командной строки.
Для этого вам нужно будет использовать jvisualvm / jconsole.
Я бы посоветовал вам использовать эти инструменты, чтобы определить, почему ваша программа занимает много памяти.
В любом случае вы не должны форсировать сборщик мусора, так как это наверняка нарушит алгоритм сборщика мусора и замедлит вашу программу.
Есть еще несколько решений (здесь уже много хороших примеров):
gc()
. gc()
на MemoryMBeanСледующий пример для cmdline-jmxclient:
$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc
Это хорошо, потому что это всего одна строка, и вы можете легко вставить ее в сценарий.
If you run jmap -histo:live
, that will force a full GC on the heap before it prints anything out.