Как запустить ручной Java GC из консоли Linux без X11 - PullRequest
7 голосов
/ 11 ноября 2010

Мне нужен способ, чтобы иметь возможность запускать полный GC из консольного скрипта linux на Ubuntu. Я знаю, что это очень плохая практика, но не вдаваясь в подробности, это позволяет моему серверу работать. Это только на 1 или 2 дня, пока я исправляю проблему, поэтому мне не нужно просыпаться ночью и выполнять ручной GC через jconsole или jvisualvm.

В качестве альтернативы я должен сделать скрипт мыши, который нажимает кнопку каждые 3-4 часа или около того, что еще хуже.

Пожалуйста, помогите.

Ответы [ 4 ]

11 голосов
/ 11 ноября 2010

Если ваше приложение может запускать сервер JMX (что, как я полагаю, подразумевается при использовании вами jconsole / jvisualvm), то вы можете вызывать операцию Memory MBean gc через утилиты командной строки.

* 1003Во-первых, вам понадобится какой-нибудь JMX-клиент для командной строки.Я использовал этот в прошлом для простых вызовов командной строки, и он работал нормально.(Изменить: Фактически я использовал его только сейчас, чтобы протестировать следующую команду, и он успешно вызвал GC для локального процесса Tomcat)

Затем вам нужно будет разработать команду для запуска сборки мусора.Я думаю, что это должно работать (вам, конечно, нужно изменить хосты / порты / учетные данные соответствующим образом):

java -jar cmdline-jmxclient-X.X.jar - localhost:8081 java.lang:type=Memory gc

Наконец, вы можете запланировать вызов этой команды через cron или эквивалентный.

Вуаля!

7 голосов
/ 02 октября 2014

Если у вас есть oracle jvm 1.7, вы можете использовать jcmd для отображения PID jvm, а затем от jcmd <pid> GC.run до GC.

jcmd <pid> help покажет вам, какие другие команды доступны.

3 голосов
/ 30 сентября 2015
jcmd <pid> GC.run

Пример:

jcmd 20350 GC.run
0 голосов
/ 11 ноября 2010

Это неплохая практика, это невозможно - даже для java-приложения, выполняемого JVM.Доступен вызов gc (), но даже для JVM это только подсказка для запуска сборки мусора.Из консоли обычно невозможно повлиять на JVM во время его работы.

Некоторые задали этот вопрос для платформы Windows, см. Вопрос Как запросить сборку мусора JVM (не из кода)при запуске из командной строки Windows

Вы можете проверить аргументы JVM для размеров стека / кучи (как минимальных, так и максимальных).В этой области можно выполнить множество настроек, но в основном они относятся к используемой вами JVM.

Настройка производительности JVM для крупных приложений

...