«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 меняется в зависимости от используемого алгоритма сборки мусора.
Далее мы рассмотрим аннотирование наших журналов информацией о дате и времени.
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
Или, чтобы записать журнал GC в файл, мы должны запустить:
java — cp $CLASSPATH -Xloggc:/tmp/gc.log mypackage.MainClass
3. Флаги ведения журнала GC в 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+, в том числе как перенаправить эти выходные данные в файл.