web-dev-qa-db-fra.com

Rouler les journaux du ramasse-miettes en java

Est-il possible d'effectuer un roulement des journaux du 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 en utilisant fifo queues et rotatelogs pour créer un nouveau journal pour chaque jour. J'espère qu'il existe une meilleure solution pour cela.

Peut-être existe-t-il un moyen d'accéder à ces entrées de journal depuis Java afin de pouvoir les rediriger vers log4j?

Edit: la solution avec la file d'attente fifo n'est pas assez bonne car si le processus qui lit dans cette file d'attente (par exemple, rotatelogs) lit pour ralentir, l'ensemble de la JVM sera ralenti (apparemment, Sun/Oracle gc se connecte de manière synchrone)

41
Krzysztof Krasoń

Si vous ne pouvez pas mettre à niveau votre version de Java pour utiliser les nouveaux indicateurs pour la 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 fait référence à un fichier journal différent. Sous unix, cela peut être utilisé comme méthode de rotation du journal.

6
Underverse

Avez-vous essayé cette nouvelle option? 

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.

Le correctif # 6941923 pour 7u2 est référencé ici: http://www.Oracle.com/technetwork/Java/javase/2col/7u2bugfixes-1394661.html

3
Blazej

Une approche intéressante consisterait à rediriger gc.log vers un canal nommé-Xloggc:/my/named/pipeComment écrire un journal du GC dans un canal nommé

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

et connectez-vous à un enregistreur de journalisation arbitraire (par exemple, asynchrone tournant) à partir du code.

J'ai essayé ça sur une machine Windows. Malheureusement, l'installation de Windows est plus délicate que celle de Linux.

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

1

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

Il s’agit d’une approche non conventionnelle dans la mesure où vous utiliserez l’API Attach d’Oracle d’Oracle, bien que cette approche ait servi notre cas d’utilisation de la rotation des journaux GC chaque heure.

0
ajay