Как вы заставляете сбор мусора из оболочки?


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

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

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

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

8 77

8 ответов:

вы можете сделать это через бесплатный jmxterm

начиная с JDK 7 Вы можете использовать JDK command tool 'jcmd' такие как:

jcmd <pid> GC.run

Если вы запустите jmap -histo:live, Это заставит полный GC в куче, прежде чем он что-либо напечатает.

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

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

ниже приведен пример командной строки-jmxclient:

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

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

кроме user3198490'ы ответ. При выполнении этой команды может появиться следующее сообщение об ошибке:

$ 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
...

это можно решить с помощью этот ответ stackoverflow

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

здесь <process_owner> - это пользователь, который запускает процесс с PID <pid>. Вы можете получить оба от top или htop

Если вы используете jolokia С помощью вашего приложения вы можете запустить сборку мусора с помощью этой команды:

curl http://localhost:8558/jolokia/exec/java.lang:type=Memory/gc

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

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

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

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

всего:

kill -SIGQUIT <PID>