Rouler des journaux de ramasse-miettes en Java

Est-il possible de faire rouler des journaux de ramasse-miettes dans Sun JVM?

Actuellement, je génère des journaux en utilisant:

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

Mais je dois les faire pivoter manuellement à l’aide de files d’attente fifo et de rotatelogs pour créer un nouveau journal pour chaque jour. J’espère qu’il existe une meilleure solution pour cela.

Peut-être y a-t-il un moyen d’accéder à ces entrées de journal depuis Java afin que je puisse les redirect vers log4j?

Edit: la solution avec la queue fifo n’est pas assez bonne parce que si le processus qui lit à partir de cette queue (par exemple rotatelogs) se ralentit, cela ralentira tout le jvm (apparemment Sun / Oracle effectue une journalisation synchronisée)

    La prise en charge intégrée de la rotation des journaux GC a été ajoutée à la machine virtuelle Java HotSpot. Il est décrit dans la RFE 6941923 et est disponible en:

    • Java 6 Update 34
    • Java 7 Update 2 (mais il n’y est pas fait référence dans ces notes de version)

    Trois nouveaux indicateurs JVM peuvent être utilisés pour l’activer et le configurer:

    • -XX:+UseGCLogFileRotation
      doit être utilisé avec -Xloggc: ;
    • -XX:NumberOfGCLogFiles=
      doit être> = 1, la valeur par défaut est un;
    • -XX:GCLogFileSize=M (or K)
      la valeur par défaut sera 512K.

    Si vous ne pouvez pas mettre à niveau votre version java pour utiliser les nouveaux indicateurs de rotation du journal gc, vous pouvez spécifier un fichier gc différent à chaque démarrage de l’application:

     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` 

    Lorsque setenv est référencé, généralement au démarrage ou à l’arrêt, il référencera un fichier journal différent. En unix, cela peut être utilisé comme une méthode de «rotation» du journal.

    Avez-vous essayé ces nouvelles options?

    J’ai essayé jdk7u7, jdk7u6 et jdk6u35 comme ceci:

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

    mais avec chaque version je vois cette erreur:

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

    La correction # 6941923 pour 7u2 est référencée ici: http://www.oracle.com/technetwork/java/javase/2col/7u2bugfixes-1394661.html

    Une approche intéressante serait de redirect gc.log vers un canal nommé -Xloggc:/my/named/pipe Comment écrire un journal GC sur un canal nommé

    puis lisez ce tuyau de l’application elle-même: Comment ouvrir un canal nommé Windows à partir de Java?

    et se connecter à un journal de journalisation arbitraire (par exemple, asynchrone) à partir du code.

    J’ai essayé que sur une machine Windows. Malheureusement, il est plus difficile à configurer sous Windows que sous Linux.

    Sous Windows, il fonctionne essentiellement avec l’aide d’un script Powershell supplémentaire (peut également être une application dédiée). Cet exemple de projet contient également une application de démonstration qui peut être utilisée immédiatement pour tester la redirection des journaux GC vers la connexion via SLF4J.

    J’ai fini par résoudre ce problème en créant un nouveau thread dans mon application et en envoyant périodiquement la commande jcmd log-rotate (basée sur une expression cron).

    Il s’agit d’une approche non conventionnelle car vous utiliserez l’ API Attach d’Oracle, bien que cette approche ait servi notre cas d’utilisation des journaux GC tournants toutes les heures.