Pergunta

Primeiro algumas informações sobre a aplicação. Eu tenho um aplicativo de processamento de várias tarefas independentes em paralelo através de um pool de threads. O pool de threads está agora pendurado.

A seguir, um trecho de meus depósitos de rosca, todos os meus Tópicos no pool-2 são bloqueados por "pool-2-thread-78". Ele parece estar bloqueado tentando escrever para o console que eu acho muito estranho. Alguém pode lançar alguma luz sobre a situação para mim?

Editar : detalhes plataforma java version "1.6.0_07" Java (TM) SE Runtime Environment (construção 1.6.0_07-b06) Java HotSpot (TM) Cliente VM (construção 10.0-b23, modo misto, partilha)

Ubuntu Linux servidor dupla máquina quad core.

Parece travar ao escrever no PrintStream, tenho considerado apenas remover a appender consola no entanto eu preferiria saber por que está bloqueando e removê-lo com base nesse conhecimento. No passado, o remove e ver se funciona voltou a morder-me:)

seção relevante do meu log4j

log4j.rootLogger = DEBUG, STDOUT log4j.logger.com.blah = INFO, LOG log4j.appender.STDOUT = org.apache.log4j.ConsoleAppender log4j.appender.LOG = org.apache.log4j.FileAppender

extrato de despejo de rosca

"pool-2-thread-79" id = 149 bloqueado no org.apache.log4j.spi.RootLogger@6c3ba437 propriedade da "pool-2-thread-78" id = 148 em org.apache.log4j.Category.callAppenders (Category.java:201) em org.apache.log4j.Category.forcedLog (Category.java:388) em org.apache.log4j.Category.error (Category.java:302) em com.blah.MessageProcessTask.run (MessageProcessTask.java:103) em java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:441) em java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask / java: 268) em java.util.concurrent.FutureTask.run (FutureTask / Java: 54) em java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:885) em java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:907) em java.lang.Thread.run (Thread.java:619)

"pool-2-thread-78" id = 148 RUNNABLE em java.io.FileOutputStream.writeBytes (Nativo Método) a java.io.FileOutputStream.write (FileOutputStream.java:260) em java.io.BufferedOutputStream.write (BufferedOutputStream.java:105) - bloqueado <0x6f314ba4> (a java.io.BufferedOutputStream) em java.io.PrintStream.write (PrintStream.java:430) - bloqueado <0xd5d3504> (a java.io.PrintStream) em org.apache.log4j.ConsoleAppender $ SystemOutStream.write (ConsoleAppender.java:173) em sun.nio.cs.StreamEncoder.writeBytes (StreamEncoder.java:202) em sun.nio.cs.StreamEncoder.implFlushBuffer (StreamEncoder.java:272) em sun.nio.cs.StreamEncoder.implFlush (StreamEncoder.java:276) em sun.nio.cs.StreamEncoder.flush (StreamEncoder.java:122) - bloqueado <0x6243a076> (a java.io.OutputStreamWriter) em java.io.OutputStreamWriter.flush (OutputStreamWriter.java:212) em org.apache.log4j.helpers.QuietWriter.flush (QuietWriter.java:57) em org.apache.log4j.WriterAppender.subAppend (WriterAppender.java:315) em org.apache.log4j.WriterAppender.append (WriterAppender.java:159) em org.apache.log4j.AppenderSkeleton.doAppend (AppenderSkeleton.java:230) - bloqueado <0x45dbd560> (a org.apache.log4j.ConsoleAppender) em org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders (AppenderAttachableImpl.java:65) em org.apache.log4j.Category.callAppenders (Category.java:203) - bloqueado <0x6c3ba437> (a org.apache.log4j.spi.RootLogger) em org.apache.log4j.Category.forcedLog (Category.java:388) em org.apache.log4j.Category.error (Category.java:302) em com.blah.MessageProcessTask.run (MessageProcessTask.java:103) em java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:441) em java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask / Java: 268) em java.util.concurrent.FutureTask.run (FutureTask / Java: 54) em java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:885) em java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:907) em java.lang.Thread.run (Thread.java:619)

Foi útil?

Solução

Você pode usar o AsyncAppender para melhor destacar o logger dos appenders.

No Windows, se você clicar na janela do console, isso vai fazer uma pausa no console, por exemplo, o buffer stdout vai encher-se, e como o appender consola escreve em série, o aplicativo irá travar até soltar o console (pressione enter ou assim).

Considere o uso de AsyncAppender com log4j - na maioria das vezes, é boa ideia - a única beeing problema -. Buffer AsynAppender não é liberado completamente na saída

Outras dicas

Em primeiro lugar, eu acredito log4j escreve a arquivos ea consola série ou então todos os seus registros seriam corrompidos. Assim, enquanto um segmento está escrevendo outro segmento que quer escrever tem que esperar até que o outro está terminado. Também, stdout pode bloquear se o que está ligado a ela do outro lado não está drenando-lo.

em unix há um descritor de arquivo especial chamado stdout. quando você iniciar aplicações no stdout console será conectado ao console. Você também pode redirecionar stdout para outros arquivos. ex: java Blah> / dev / null. chances são que você tem apontar stdout para um arquivo que está enchendo. por exemplo, um tubo é um arquivo e se o programa na outra extremidade não está drenando o tubo, em seguida, o programa que está a escrever para o tubo acabará por bloquear.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top