2013-11-20 63 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