Итак, я смотрю на кучу с jmap на удаленном компьютере и хочу принудительно запустить сборку мусора. Как это сделать, не заходя в jvisualvm или jconsole и друзей?
Я знаю, что вы не должны практиковать принудительную сборку мусора - вам просто нужно выяснить, почему куча большая / растет.
Я также понимаю, что System.GC () на самом деле не вызывает сборку мусора - он просто сообщает GC, что вы хотите, чтобы это произошло.
Сказав, что есть способ сделать это легко? Мне не хватает какого-то приложения командной строки?
java
garbage-collection
jmx
jmap
Эйберг
источник
источник
Ответы:
Вы можете сделать это с помощью бесплатной программы jmxterm .
Запустите его так:
Оттуда вы можете подключиться к хосту и запустить сборщик мусора:
Посмотрите документацию на веб-сайте jmxterm для получения информации о встраивании этого в сценарии bash / perl / ruby / other. Для этого я использовал popen2 в Python или open3 в Perl.
ОБНОВЛЕНИЕ: здесь однострочник с использованием jmxterm:
источник
Начиная с JDK 7 вы можете использовать командный инструмент JDK 'jcmd', например:
jcmd <pid> GC.run
источник
Explicit GC is disabled, no GC has been performed
это, возможно, из-за-XX:+DisableExplicitGC
аргумента VM. См .: mail.openjdk.java.net/pipermail/serviceability-dev/2017-August/…Если вы запустите
jmap -histo:live <pid>
, это вызовет полный сбор мусора в куче, прежде чем он что-либо распечатает.источник
jcmd
Теперь правильный инструмент для работы.Дополнение к user3198490 ответу «s. При выполнении этой команды может появиться следующее сообщение об ошибке:
Это можно решить с помощью этого ответа stackoverflow
где
<process_owner>
пользователь, запускающий процесс с PID<pid>
. Вы можете получить как от, такtop
иhtop
источник
java.io.IOException: Operation not permitted
sudo -u <process_owner> jcmd <pid> GC.run
, не могли бы вы попробовать? Командование должно быть безопаснымЕсть еще несколько решений (здесь уже много хороших):
gc()
.gc()
операцию на MemoryMBeanСледующий пример предназначен для cmdline-jmxclient:
Это хорошо, потому что это всего одна строка, и вы можете очень легко вставить ее в сценарий.
источник
для Linux:
jcmd
упакован с JDK,$(pgrep java)
получает идентификатор процесса javaисточник
Я не думаю, что для этого есть какой-либо параметр командной строки.
Для этого вам нужно будет использовать jvisualvm / jconsole.
Я бы посоветовал вам использовать эти инструменты, чтобы определить, почему ваша программа занимает много памяти.
В любом случае вы не должны форсировать сборщик мусора, так как это наверняка нарушит алгоритм сборщика мусора и замедлит вашу программу.
источник
Если вы используете jolokia в своем приложении, вы можете запустить сборку мусора с помощью этой команды:
источник
просто:
источник