Как принудительно выполнить сборку мусора из оболочки?

Так что я смотрю на кучу с jmap на удаленном боксе и хочу навязать ему сборку мусора. Как вы можете сделать это, не заходя в jvisualvm или jconsole и друзей?

Я знаю, что вы не должны практиковать принудительный сбор мусора - вы просто должны выяснить, почему куча большая / растет.

I также реализовать систему. GC () на самом деле не вызывает сборку мусора - он просто сообщает GC, что вы хотели бы, чтобы это произошло.

Сказав, что есть способ сделать это легко? Мне не хватает приложения из командной строки?

98
задан Kara 22 January 2014 в 06:06
поделиться

4 ответа

Это можно сделать с помощью бесплатной программы 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
22
ответ дан 24 November 2019 в 05:06
поделиться

Я не думаю, что для этого есть какой-либо параметр командной строки.

Для этого вам нужно будет использовать jvisualvm / jconsole.

Я бы посоветовал вам использовать эти инструменты, чтобы определить, почему ваша программа занимает много памяти.

В любом случае вы не должны форсировать сборщик мусора, так как это наверняка нарушит алгоритм сборщика мусора и замедлит вашу программу.

0
ответ дан 24 November 2019 в 05:06
поделиться

Есть еще несколько решений (здесь уже много хороших примеров):

  • Напишите небольшой код для доступа к MemoryMBean и вызова gc().
  • Используя JMX-клиент командной строки (например, cmdline-jmxclient, jxmterm), запустите операцию gc() на MemoryMBean

Следующий пример для cmdline-jmxclient:

$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc

Это хорошо, потому что это всего одна строка, и вы можете легко вставить ее в сценарий.

6
ответ дан 24 November 2019 в 05:06
поделиться

If you run jmap -histo:live , that will force a full GC on the heap before it prints anything out.

100
ответ дан 24 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: