Рубрики
Без рубрики

Сбор мусора Ведение журнала в файл на Java

Узнайте, как записать информацию о сборке мусора в файл на Java.

Автор оригинала: Mark Thomas.

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+, включая перенаправление этих выходных данных в файл.