1. Обзор
Сборка мусора-это чудо языка программирования Java, обеспечивающее нам автоматическое управление памятью. Сборка мусора скрывает детали необходимости вручную выделять и освобождать память. Хотя этот механизм фантастичен, иногда он работает не так, как мы хотим. В этом уроке мы рассмотрим параметры ведения журнала Java для статистики сбора мусора и узнаем, как перенаправить эту статистику в файл .
2. Флаги ведения журнала GC в Java 8 и более ранних версиях
Во-первых, давайте рассмотрим флаги JVM, относящиеся к ведению журнала GC в версиях Java до Java 9.
2.1. -XX:+PrintGC
Флаг -XX:+PrintGC является псевдонимом для -verbose:gc и включает базовое ведение журнала GC . В этом режиме печатается одна строка для каждого молодого поколения и каждой коллекции полного поколения. Теперь давайте обратим наше внимание на предоставление подробной информации о GC.
2.2. -XX:+PrintGCDetails
Аналогично, у нас есть флаг -XX:+PrintGCDetails , используемый для активации подробного ведения журнала GC вместо -XX:+PrintGC .
Обратите внимание, что вывод из -XX:+PrintGCDetails изменяется в зависимости от используемого алгоритма GC.
Далее мы рассмотрим аннотирование наших журналов информацией о дате и времени.
2.3. -XX:+PrintGCDateStamps и -XX:+PrintGCTimeStamps
Мы можем добавлять информацию о датах и времени в наши журналы GC , используя флаги -XX:+PrintGCDateStamps и -XX:+PrintGCTimeStamps соответственно.
Во-первых, – XX:+PrintGCDateStamps добавляет дату и время записи журнала в начало каждой строки.
Во-вторых, – XX:PrintGCTimeStamps добавляет метку времени в каждую строку журнала с подробным описанием времени, прошедшего (в секундах) с момента запуска JVM.
2.4. -Xloggc
Наконец, мы приходим к перенаправлению журнала GC в файл . Этот флаг принимает необязательное имя файла в качестве аргумента, используя синтаксис -Xloggc:file , и без наличия имени файла журнал GC записывается в standard out.
Кроме того, этот флаг также устанавливает для нас флаги -XX:PrintGC и -XX:PrintGCTimestamps . Давайте рассмотрим несколько примеров:
Если мы хотим записать журнал GC в стандартный вывод, мы можем запустить:
java -cp $CLASSPATH -Xloggc mypackage.MainClass
Или, чтобы записать журнал GC в файл, мы запустим:
java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.Основной класс
3. Флаги ведения журнала GC в Java 9 и более поздних версиях
В Java 9+, -XX:PrintGC , псевдоним для -verbose:gc , устарел в пользу опции unified logging, -Xlog . Все остальные флаги GC, упомянутые выше, по-прежнему действительны в Java 9+. Эта новая опция ведения журнала позволяет нам указать, какие сообщения должны отображаться, установить уровень журнала и перенаправить вывод .
Мы можем выполнить приведенную ниже команду, чтобы просмотреть все доступные параметры для уровней журналов, декораторов журналов и наборов тегов:
java -Xlog:logging=debug -version
Например, если бы мы хотели записать все сообщения GC в файл, мы бы запустили:
java -cp $CLASSPATH -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass
Кроме того, этот новый флаг унифицированного ведения журнала повторяется, поэтому вы можете, например, записывать все сообщения GC как в стандартный выход, так и в файл :
java -cp $CLASSPATH -Xlog:gc*=debug:stdout -Xlog:gc*=debug:file=/tmp/gc.log mypackage.MainClass
4. Заключение
В этой статье мы показали, как регистрировать выходные данные сборки мусора как в Java 8, так и в Java 9+, включая перенаправление этих выходных данных в файл.