it-swarm.com.de

Müllsammler meldet sich in Java an

Ist es möglich, Müllsammelprotokolle in Sun JVM zu rollen?

Derzeit generiere ich Protokolle mit:

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

Ich muss sie jedoch manuell mithilfe von Fifo-Warteschlangen und Rotationsprotokollen drehen, um für jeden Tag ein neues Protokoll zu erstellen. Ich hoffe, dass es dafür eine bessere Lösung gibt.

Vielleicht gibt es eine Möglichkeit, auf diese Protokolleinträge von Java aus zuzugreifen, um sie auf log4j umzuleiten.

Edit: Die Lösung mit der FIFO-Warteschlange ist nicht gut genug, denn wenn der Prozess, der aus dieser Warteschlange liest (z. B. Rotatelogs), langsamer wird, verlangsamt sich der gesamte jvm (anscheinend führt Sun/Oracle die gc-Protokollierung synchron durch).

41

Die integrierte Unterstützung für die GC-Protokollrotation wurde der HotSpot-JVM hinzugefügt. Es wird in RFE 694192 beschrieben und ist verfügbar in:

Es gibt drei neue JVM-Flags, die zum Aktivieren und Konfigurieren verwendet werden können:

  • -XX:+UseGCLogFileRotation
    muss mit -Xloggc:<filename> verwendet werden;
  • -XX:NumberOfGCLogFiles=<number of files>
    muss> = 1 sein, Standard ist eins;
  • -XX:GCLogFileSize=<number>M (or K)
    ist standardmäßig auf 512 KB eingestellt.
84
Johan Kaving

Wenn Sie Ihre Java-Version nicht aktualisieren können, um die neuen Flags zum Drehen des gc-Protokolls zu verwenden, können Sie bei jedem Start der Anwendung eine andere gc-Datei angeben:

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`

Wenn auf "setenv" verwiesen wird, normalerweise beim Starten oder Herunterfahren, wird auf eine andere Protokolldatei verwiesen. In Unix kann dies als Methode zum "Drehen" des Protokolls verwendet werden.

6
Underverse

Haben Sie diese neuen Optionen ausprobiert? 

Ich habe jdk7u7, jdk7u6 und jdk6u35 so ausprobiert:

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

aber bei jeder Version sehe ich diesen Fehler:

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

Auf den Bugfix # 6941923 für 7u2 wird hier verwiesen: http://www.Oracle.com/technetwork/Java/javase/2col/7u2bugfixes-1394661.html

3
Blazej

Ein interessanter Ansatz wäre, gc.log auf eine Named Pipe umzuleiten-Xloggc:/my/named/pipeWie schreibt man das GC-Log in die Named Pipe

lesen Sie dann diese Pipe aus der Anwendung selbst: Wie kann ich eine Named Pipe von Windows aus öffnen?

und von einem beliebigen Code in einen beliebigen (z. B. asynchronen, rollenden) Logback-Logger zu protokollieren.

Versuchte das auf einem Windows-Rechner. Leider ist das Setup unter Windows schwieriger als unter Linux.

Unter Windows funktioniert es grundsätzlich mit Hilfe eines zusätzlichen Powershell-Skripts (kann auch eine dedizierte Anwendung sein) . Dieses Beispielprojekt enthält auch eine Demo-Anwendung, die sofort zum Testen der Anwendung verwendet werden kann GC protokolliert die Umleitung zu Logback über SLF4J.

1

Am Ende habe ich dieses Problem gelöst, indem ich einen neuen Thread in meiner Anwendung gestartet habe und regelmäßig den Befehl jcmd log-rotate gesendet habe (basierend auf einem cron-Ausdruck).

Dies ist ein unkonventioneller Ansatz, da Sie die Attach API von Oracle von Oracle verwenden werden, obwohl der Ansatz unserem Anwendungsfall diente, stündlich rotierende GC-Protokolle zu verwenden.

0
ajay

Die Verwendung von -XX: + UseGCLogFileRotation führt bei den Solaris- und JDK-Versionen 1.7.0_80 - ​​1.7.0_97 und 1.8.0_20 - 1.8.0_77 zu schwerwiegenden Problemen mit langen Sicherheitspunkten

0
user9429838