1. Обзор
Сборка мусора — это чудо языка программирования Java, предоставляющее нам автоматическое управление памятью. Сборка мусора скрывает детали необходимости ручного выделения и освобождения памяти. Хотя этот механизм является фантастическим, иногда он работает не так, как нам хотелось бы. В этом руководстве мы рассмотрим параметры ведения журнала Java для статистики сборки мусора и узнаем, как перенаправить эту статистику в файл .
2. Флаги ведения журнала сборщика мусора в Java 8 и более ранних версиях
Во-первых, давайте рассмотрим флаги JVM, связанные с ведением журнала GC в версиях Java до Java 9.
2.1. -XX:+ПечатьГК
Флаг -XX:+PrintGC
является псевдонимом для -verbose:gc
и включает базовое ведение журнала сборщика мусора . В этом режиме для каждой коллекции молодого поколения и каждой коллекции полного поколения печатается одна строка. Давайте теперь обратим наше внимание на предоставление подробной информации GC.
2.2. -XX:+ПечатьGCDetails
Точно так же у нас есть флаг -XX:+PrintGCDetails,
используемый для активации подробного ведения журнала GC вместо -XX:+PrintGC
.
Обратите внимание, что выходные данные команды -XX:+PrintGCDetails
меняются в зависимости от используемого алгоритма сборки мусора.
Далее мы рассмотрим аннотирование наших журналов информацией о дате и времени.
2.3. -XX:+PrintGCDateStamps
и -XX:+PrintGCTimeStamps
Мы можем добавить информацию о датах и времени в наши журналы GC , используя флаги -XX:+PrintGCDateStamps
и -XX:+PrintGCTimeStamps
соответственно.
Во- первых, -XX:+PrintGCDateStamps
добавляет дату и время записи журнала в начало каждой строки.
Во- вторых, -XX:PrintGCTimeStamps
добавляет отметку времени к каждой строке журнала с подробным описанием времени (в секундах), прошедшего с момента запуска JVM.
2.4. -Xloggc
Наконец, мы подошли к перенаправлению журнала GC в файл . Этот флаг принимает необязательное имя файла в качестве аргумента с использованием синтаксиса -Xloggc:file,
и без наличия имени файла журнал GC записывается в стандартный вывод.
Кроме того, этот флаг также устанавливает для нас флаги -XX:PrintGC
и -XX:PrintGCTimestamps
. Давайте рассмотрим несколько примеров:
Если мы хотим записать журнал GC в стандартный вывод, мы можем запустить:
java -cp $CLASSPATH -Xloggc mypackage.MainClass
Или, чтобы записать журнал сборщика мусора в файл, мы запустим:
java -cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass
3. Флаги ведения журнала сборщика мусора в Java 9 и более поздних версиях
В Java 9+ -XX:PrintGC
, псевдоним для -verbose:gc
, устарел в пользу опции унифицированного ведения журнала -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+, в том числе как перенаправить эти выходные данные в файл.