2009-04-15 3 views
11

Как я могу запросить сбор мусора Java извне, запустив программу из JAR (используемая Windows BAT)?Как запросить сбор мусора JVM (не из кода) при запуске из командной строки Windows

  • Из кода Java я могу сделать это с System.gc()
  • При выполнении распределения JNLP, я получаю этот «Java консоль» включена в панели управления/Java/... и эта консоль Java обеспечивает ручной мусор коллекция.

Но ... Когда я запускаю банку из командной строки/bat, консоль java, похоже, не открывается. Не удалось найти помощь с кратким поиском, может быть, кем-то здесь?

ответ

9

Вы можете использовать jconsole для подключения к JVM, работающему локально. Это обеспечивает кнопку «Выполнить GC» в графическом интерфейсе.

При запуске вашего Java-процесса вам необходимо указать -Dcom.sun.management.jmxremote.

+0

Спасибо, кажется, работает хорошо! – Touko

5

Если вы используете самую последнюю версию java 6, у вас также есть jvisualvm, который дополняет и расширяет функциональность jconsole. Они оба очень полезны.

1

У вас обычно нет причин принуждать сбор мусора. Выполняя это, запутывают алгоритмы сбора мусора (в основном их производительность). Это также замедлит программу во время сбора мусора. Если проблема с памятью, вы должны использовать инструменты трассировки памяти, чтобы узнать, где находятся ссылки. (Являются ли слушатели незарегистрированными?)

Как и в других ответах, вы можете использовать jconsole или jvisualvm. Вы также можете использовать jmx для этого программно.

+0

Существует множество законных способов использования коллекции GC. Один из них предназначен для тестирования. Другой пример: если вы разрабатываете систему с низкой памятью с помощью SSD-обмена. Java не знает, является ли память «быстрой памятью» или свопом. Поэтому Java, как правило, использует всю свободную память, прежде чем автоматически запускать GC. В этом случае Fire GC вручную может многое помочь. Очевидно, что это не рекомендуется в любом случае для использования в серверном производстве (по крайней мере, я не могу сейчас это сделать). –

3

Для чисто командной строки вы должны иметь возможность использовать jcmd. Я считаю, что jcmd был частью стандартной установки JDK с по крайней мере Java 1.7. Команда будет что-то вроде этого:

jcmd <process-id> GC.run 

Вы можете получить список доступных диагностических команд, которые jcmd обеспечивает для конкретного процесса, как это:

jcmd <process-id> help