Подтвердить что ты не робот

Журналы сборщиков мусора в java

Можно ли выполнить кастинг журналов сборщиков мусора в Sun JVM?

В настоящее время я создаю журналы, используя:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -verbose:gc -Xloggc:gc.log 

Но я должен вручную повернуть их, используя fifo queues и rotatelogs, чтобы создать новый журнал для каждого дня. Я надеюсь, что для этого есть лучшее решение.

Может быть, есть способ получить доступ к этим записям журнала изнутри java, чтобы я мог перенаправить их на log4j?

Изменить: решение с очередью fifo недостаточно для того, чтобы, если процесс, который читает из этой очереди (например, rotatelogs), читает, чтобы замедлить, это замедлит весь jvm (видимо, Sun/Oracle делает gc протоколирование синхронно)

4b9b3361

Ответ 1

В JSM HotSpot добавлена ​​встроенная поддержка вращения журнала GC. Он описан в RFE 6941923 и доступен в:

Существует три новых флага JVM, которые можно использовать для его включения и настройки:

  • -XX:+UseGCLogFileRotation
    следует использовать с -Xloggc:<filename>;
  • -XX:NumberOfGCLogFiles=<number of files>
    должно быть >= 1, по умолчанию один;
  • -XX:GCLogFileSize=<number>M (or K)
    default будет установлено в 512K.

Ответ 2

Если вы не можете обновить версию java, чтобы использовать новые флаги для вращения gc-журнала, вы можете указать другой файл gc каждый раз, когда приложение запускается:

JAVA_OPTS="-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/path/to/log/dir/gc.log-"`date +%Y-%m-%d-%H-%M`

Когда ссылка setenv указана, как правило, при запуске или завершении работы, она будет ссылаться на другой файл журнала. В unix это можно использовать как метод для "поворота" журнала.

Ответ 3

Вы пробовали эти новые опции?

Я попробовал jdk7u7, jdk7u6 и jdk6u35 вот так:

java -Xloggc:gc.log -XX:+PrintGCDetails -XX:+UseGCLogRotation -XX:NumberOfGClogFiles=3 -XX:GCLogFileSize=10M

но с каждой версией я вижу эту ошибку:

Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Исправление # 6941923 для 7u2 указано здесь: http://www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html

Ответ 4

Интересным подходом было бы перенаправить gc.log на именованный канал -Xloggc:/my/named/pipe Как записать журнал GC в именованный канал

тогда прочитайте, что труба формирует само приложение: Как открыть именованный канал Windows с Java?

и запишите в произвольный (например, асинхронный) журнал регистрации ошибок из кода.

Пробовал это на машине Windows. К сожалению, сложнее настроить в Windows, чем в Linux.

В Windows он работает в основном с помощью дополнительного Powershell script (может также быть выделенное приложение). Этот образец проекта также содержит демонстрационное приложение, которое можно использовать сразу же, чтобы проверить перенаправление журналов GC на Logback через SLF4J.

Ответ 5

Я решил эту проблему, создав новый поток в моем приложении и периодически посылая команду jcmd log-rotate (на основе выражения cron).

Это нестандартный подход, поскольку вы будете использовать Oracle Attach API, хотя этот подход позволил использовать наш вариант чередования журналов GC ежечасно.

Ответ 6

Использование -XX: + UseGCLogFileRotation вызовет серьезную проблему с длинной безопасной точкой для версий Solaris и JDK 1.7.0_80 - 1.7.0_97 и 1.8.0_20 - 1.8.0_77