Принудительный Full GC Java-процессов по cron

0 3 * * * for pid in $(pgrep -u spring -x java); do java_bin=$(readlink -f "/proc/$pid/exe") && jcmd="$(dirname "$java_bin")/jcmd" && [ -x "$jcmd" ] && "$jcmd" "$pid" GC.run; done >/dev/null 2>&1

Суть:

pgrep -u spring -x java находит все процессы с именем java, принадлежащие пользователю spring.

Для каждого PID через /proc/$pid/exe определяется реальный исполняемый файл Java.

Рядом с найденным java ищется соответствующий jcmd:

jcmd="$(dirname "$java_bin")/jcmd"

Если jcmd существует и исполняемый, выполняется:

jcmd PID GC.run

Команда инициирует Full GC внутри соответствующей JVM.

jcmd должен иметь возможность подключиться к JVM. Сron следует запускать от пользователя spring или от root. Если jcmd отсутствует рядом с используемым java, эта JVM будет молча пропущена.

Поделиться
Отправить