2013-11-20 62 views
2

这里是行为:死锁使用Java日志框架

我运行的东西记录到文件和控制台很经常的应用。今天早上它挂断了。由线程运行的方法超过一个小时不会返回。一旦我按下命令行上的输入,它就会继续。使用JConsole,我能够提取我看到的唯一可疑事物(JConsole未检测到任何死锁)。

这里是日志,超过一小时跑了方法:

Name: Thread-4 
State: RUNNABLE 
Total blocked: 38 Total waited: 56,153 

Stack trace: 

java.io.FileOutputStream.writeBytes(Native Method) 
java.io.FileOutputStream.write(FileOutputStream.java:318) 
java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) 
    - locked [email protected] 
java.io.PrintStream.write(PrintStream.java:480) 
    - locked [email protected] 
sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) 
sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) 
sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) 
sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) 
    - locked [email protected] 
java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) 
java.util.logging.StreamHandler.flush(StreamHandler.java:242) 
    - locked [email protected] 
java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:106) 
java.util.logging.Logger.log(Logger.java:522) 
java.util.logging.Logger.doLog(Logger.java:543) 
java.util.logging.Logger.log(Logger.java:607) 
com.mycomp.myproj.util.Log.log(Log.java:126) 
com.mycomp.myproj.util.Log.logWarning(Log.java:79) 
com.mycomp.myproj.eng.engine.runEngine(RunEngine.java:397) 
com.mycomp.myproj.eng.engine.runEngine(RunEngine.java:297) 
com.mycomp.myproj.eng.engine.runEngine(RunEngine.java:288) 
com.mycomp.myproj.ModelYear.runYear(ModelYear.java:118) 
com.mycomp.myproj.Monitor.runModel(Monitor.java:749) 
com.mycomp.myproj.MonitorThread.run(MonitorThread.java:37) 

有人可以给我什么可能是错误的提示,如何解决,是资源查看?

+0

在猜测我会说它正在等待文件,做了一些其他线程/进程锁定文件? – Taylor

+0

我跑了单独的实例,但是,我确保只有第一个实例有一个FileHandler(只有第一个实例写入日志文件)。没有别的东西写入日志文件。这是来自第一个实例的日志(第二个实例没有被挂起)。另外,即使它们都在同时写入,第二个实例我们创建了第二个文件log.log2并在那里写入。 – jn1kk

回答

0

一旦我按下命令行上输入,它继续。

似乎控制台正在请求输出被阻止。

例如,Process文档列出以下警告:

由于某些本地平台只提供用于标准输入和输出流有限缓冲区的大小,没有及时写输入流或读取的输出流子进程可能会导致子进程阻塞甚至死锁。

即使控制台是一个过程。

+0

这可能没有明确扫描标准输入?命令行缓冲区可能太大而无法清除? – jn1kk

+0

我也很怀疑,但从您发布的内容来看,这些是我将证明排除此问题的前两个问题。另外,你的程序如何启动?你在运行什么O/S和JVM? – jmehrens

+0

Windows 7家庭高级版64位。最新的64位JDK。我开始使用ProcessBuilder将Std Err重定向到Std In。我在开始流程后只读了一个流。我意识到这个警告,我认为我无法做更多的事情来更快地阅读。 – jn1kk