Как запустить ручной JAVA GC из консоли linux без X11
Мне нужен способ, чтобы иметь возможность запускать полный GC из консольного скрипта linux на ubuntu. Я знаю, что это очень плохая практика, но не вдаваясь в подробности, это держит мой сервер работает, это предназначено только для 1 или 2 дней, пока я исправляю фактическую проблему, поэтому мне не нужно просыпаться ночью и выполнять ручной GC через jconsole или jvisualvm.
в качестве альтернативы я должен сделать скрипт мыши, который нажимает кнопку каждые 3-4 часа или около того, что еще хуже.
пожалуйста, помогите.
4 ответов
Если вы можете запустить приложение JMX-сервера (что, я считаю, подразумевается из вашего использования jconsole / jvisualvm), то вы можете вызвать память MBean в gc
работа с помощью утилит командной строки.
во-первых, вам понадобится какой-то клиент командной строки JMX. Я использовал этот в прошлом для простых вызовов командной строки, и он работал нормально. (Edit: на самом деле я использовал его только сейчас, чтобы проверить следующую команду, и он успешно вызвал GC на локальный процесс котяра)
тогда вам нужно будет разработать команду для запуска сбора мусора. Я думаю, что это должно работать (вам, конечно, нужно будет изменить хосты/порты/учетные данные по мере необходимости):
java -jar cmdline-jmxclient-X.X.jar - localhost:8081 java.lang:type=Memory gc
наконец, вы можете запланировать вызов этой команды с помощью cron
или эквивалент.
вуаля!
Если у вас есть oracle JVM 1.7, вы можете использовать jcmd
чтобы перечислить PIDs jvm, а затем jcmd <pid> GC.run
в GC.
jcmd <pid> help
покажет вам, какие другие команды доступны.
Это не плохая практика, это невозможно-даже для java-приложения, выполняемого JVM. Существует вызов gc (), но даже это только намек на JVM для запуска сборки мусора. С консоли обычно нет способа повлиять на JVM во время его работы.
некоторые задали этот вопрос для платформы Windows, см. вопрос как запросить сборку мусора JVM (не из кода) при запуске из Windows командная строка
вы можете проверить аргументы JVM для размеров стека/кучи (как min, так и max). Есть много настроек, которые вы можете сделать в этой области, но они в основном специфичны для JVM, который вы используете.