2010-09-29 5 views
36

Возможно ли сделать прокатку сборщиков мусора в Sun JVM?Журналы для сбора мусора в ящике

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

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

Но я должен вручную вращать их с помощью ФИФО очередей и rotatelogs создать новый журнал на каждый день. Надеюсь, что для этого есть лучшее решение.

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

Edit: решение с очереди ФИФО не достаточно хорошо, потому что, если процесс, который считывает из этой очереди (например, rotatelogs) читает, чтобы замедлить это будет замедлять всю JVM (по-видимому, вс/Oracle делает дс регистрации синхронно)

+0

Ваше решение звучит неплохо для меня; что вам не нравится? У вас есть colocation: поворот происходит рядом с вашим Java-вызовом (который настраивает ведение журнала), а не в коде приложения (который не должен забывать о регистрации). –

+0

Также моя кишка скажет «нет», это невозможно, или, если возможно, это будет через закрытый, ограниченный API, который вы, вероятно, не хотите вставлять в свое приложение. –

+0

-XX: + PrintGCDateStamps не применяется к java5? –

ответ

77

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

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

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

-XX: NumberOfGClogФайлы должны иметь капитал L (-XX: NumberOfGCLogFiles) –

+0

Жаль, что это не в день, я не вижу точки в качке, я обычно хочу видеть журналы с данного дня, а не 123MB :) –

+2

Точка по размеру - это то, что общий размер файлов журнала ограничен (в NumberOfGCLogFiles * GCLogFileSize), что позволяет избежать ошибок без пробелов слева на устройстве и перевешивает неудобство поиска журналов данного дня , – vboerchers

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. 

Bugfix # 6941923 для 7u2 ссылается здесь: http://www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html

+1

Ваш флаг неверен - это «-XX: + UseGCLogFileRotation» (вам не хватает «Файл» во флагах) – Ryan

+1

И в «-XX: NumberOfGClogFiles» отсутствует столица «L» (как это было изначально в моем ответе) –

+0

Это не ошибка Blazej, опечатки указаны в документации об ошибках, на которую он ссылался (http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6941923). – t0r0X

5

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

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 это можно использовать как метод для «поворота» журнала.

+0

Лучшим способом было бы добавить подробный вывод в файл и повернуть этот файл с помощью logrotate или аналогичного. Вы получаете больше журналов и не разбиты на беспорядок в разных файлах. –

+2

@Pathduck Этот ответ предназначен для более старых версий Java. Это означает, что вы не можете добавить Xlogcc. Мои эксперименты также показывают, что вы не можете заставить запущенную java закрывать и снова открывать журнал. Вы также не можете заставить его искать (EOF), java запоминает положение файла внутри Xloggc. Майор ПИТА. – kubanczyk

+0

@Pathduck К сожалению, не все системы имеют logrotate. Это решение отправлено администраторам, которым обойтись. Дата добавления в этот способ также полезна для вращения catalina.out :-) – Underverse

1

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

затем прочитать, что трубы образуют само приложение: How to open a Windows named pipe from Java?

и войти в произвольный (например асинхронной прокатке) Logback регистратор из кода.

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

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

+0

Насколько я понимаю, у вас должен быть потребитель, который слушает именованный канал, или он в конечном итоге блокируется. –

+0

Да, это проект сценария. Он также содержит «клапан» для случая. Ничто не получает сообщений и пару комментариев, которые описывают это. –

+0

Несмотря на то, что это интригует, это означает, что ваше приложение теперь зависит от этого внешнего компонента для правильной работы. Это, скорее всего, означает для нас, что мы не можем использовать его в производстве: -/ –

Смежные вопросы