Log4j est en train de suspendre mon application, qu'est-ce que je fais de mal?
Tout d'abord quelques informations sur l'application. J'ai une application de traitement de plusieurs tâches en parallèle via un pool de threads. Le pool de threads est maintenant suspendu.
Voici un extrait de mon fils décharges, tous mes Fils dans la piscine-2 sont BLOQUÉS par des "piscine-2-thread-78". Il semble être verrouillé en essayant d'écrire dans la console que je trouve extrêmement bizarre. Quelqu'un peut nous donner un indice sur la situation pour moi?
MODIFIER:
Plate-forme de détails
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Client VM (build 10.0-b23, en mode mixte, partage)
Ubuntu serveur Linux en dual quad core de la machine.
Il semble de verrouillage lors de l'écriture de la printstream, j'ai envisagé de retirer la console appender cependant je voudrais plutôt savoir pourquoi il est le blocage et l'enlever en fonction de cette connaissance. Dans le passé, l'enlever et voir si elle fonctionne a revenir à la mords-moi 🙂
section pertinente de mon log4j
log4j.rootLogger=DEBUG, STDOUT
log4j.enregistreur.com.bla=INFO, JOURNAL
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.LOG=org.apache.log4j.FileAppender
Thread dump extrait
"piscine-2-thread-79" Id=149 BLOQUÉ sur
org.apache.log4j.spi.RootLogger@6c3ba437
la propriété de "la piscine-2-thread-78" Id=148 à
org.apache.log4j.De la catégorie.callAppenders(de la Catégorie.java:201)
au
org.apache.log4j.De la catégorie.forcedLog(de la Catégorie.java:388)
au
org.apache.log4j.De la catégorie.(erreur de Catégorie.java:302)
au
com.blah.MessageProcessTask.exécuter(MessageProcessTask.java:103)
au
java.util.de façon concomitante.Les Exécuteurs$RunnableAdapter.appelez le(les Exécuteurs.java:441)
au
java.util.de façon concomitante.FutureTask$De Synchronisation.innerRun(FutureTask/java:268)
au
java.util.de façon concomitante.FutureTask.exécuter(FutureTask/java:54)
au
java.util.de façon concomitante.ThreadPoolExecutor$Par Travailleur.runTask(ThreadPoolExecutor.java:885)
au
java.util.de façon concomitante.ThreadPoolExecutor$Par Travailleur.exécuter(ThreadPoolExecutor.java:907)
au
java.lang.Fil de discussion.exécution(Thread.java:619)"piscine-2-thread-78" Id=148 EXÉCUTABLE à l'
java.io.FileOutputStream.writeBytes(Native
La méthode)
java.io.FileOutputStream.écrire(FileOutputStream.java:260)
au
java.io.BufferedOutputStream.écrire(BufferedOutputStream.java:105)
- verrouillé <0x6f314ba4> (java.io.BufferedOutputStream) à
java.io.PrintStream.écrire(PrintStream.java:430)
- verrouillé <0xd5d3504> (java.io.PrintStream) à
org.apache.log4j.ConsoleAppender$SystemOutStream.écrire(ConsoleAppender.java:173)
au
soleil.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202)
au
soleil.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272)
au
soleil.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:276)
au
soleil.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)
- verrouillé <0x6243a076> (java.io.OutputStreamWriter) à
java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)
au
org.apache.log4j.les aides.QuietWriter.flush(QuietWriter.java:57)
au
org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:315)
au
org.apache.log4j.WriterAppender.append(WriterAppender.java:159)
au
org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:230)
- verrouillé <0x45dbd560> (org.apache.log4j.ConsoleAppender) à
org.apache.log4j.les aides.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:65)
au
org.apache.log4j.De la catégorie.callAppenders(de la Catégorie.java:203)
- verrouillé <0x6c3ba437> (org.apache.log4j.le spi.RootLogger) à
org.apache.log4j.De la catégorie.forcedLog(de la Catégorie.java:388)
au
org.apache.log4j.De la catégorie.(erreur de Catégorie.java:302)
au
com.blah.MessageProcessTask.exécuter(MessageProcessTask.java:103)
au
java.util.de façon concomitante.Les Exécuteurs$RunnableAdapter.appelez le(les Exécuteurs.java:441)
au
java.util.de façon concomitante.FutureTask$De Synchronisation.innerRun(FutureTask/java:268)
au
java.util.de façon concomitante.FutureTask.exécuter(FutureTask/java:54)
au
java.util.de façon concomitante.ThreadPoolExecutor$Par Travailleur.runTask(ThreadPoolExecutor.java:885)
au
java.util.de façon concomitante.ThreadPoolExecutor$Par Travailleur.exécuter(ThreadPoolExecutor.java:907)
au
java.lang.Fil de discussion.exécution(Thread.java:619)
source d'informationauteur Paul Whelan | 2009-03-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le AsyncAppender pour mieux se détacher de l'enregistreur de données de l'appenders.
Sur Windows, si vous cliquez dans la fenêtre de la console, cette pause dans la console, par exemple, la sortie standard (stdout) de la mémoire tampon se remplit, et que la console appender écrit en série, votre application va s'accrocher jusqu'à la libération de la console (appuyez sur entrée).
Envisager d'utiliser AsyncAppender avec log4j - la plupart du temps, c'est une bonne idée, le seul problème étant la AsynAppender tampon n'est pas vidé complètement à la sortie.
tout d'abord, je crois que log4j écrit dans les fichiers et la console en série, sinon tous vos journaux pourrait être endommagé. ainsi, alors que l'un thread est en train d'écrire un autre thread qui veut écrire a plus qu'à attendre jusqu'à ce que l'autre est fini. aussi, stdout peut bloquer si tout ce qui est attaché à l'autre extrémité n'est pas le vider.
sous unix, il existe un descripteur de fichier appelé stdout. lorsque vous démarrez les applications dans la console de sortie standard (stdout) sera relié à la console. vous pouvez également rediriger stdout vers d'autres fichiers. ex: java Blah > /dev/null. les chances sont que vous avez stdout vers un fichier qui est du remplissage. par exemple, un tuyau est un fichier et si le programme à l'autre extrémité n'est pas drainant le tuyau, puis le programme qui est écrit sur le tube finira par bloc.