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

명령 줄에 Enter 키를 누르면 계속됩니다.

콘솔이 출력을 차단하도록 요청하고있는 것으로 보입니다. 일부 네이티브 플랫폼은 표준 입력 및 출력 스트림에 대한 제한 버퍼 크기, 신속하게 입력 스트림을 작성하거나의 출력 스트림을 읽을 실패를 제공하기 때문에

:

예를 들어

Process 문서는 다음과 같은 경고를 나열 하위 프로세스로 인해 하위 프로세스가 차단되거나 심지어 교착 상태가 발생할 수 있습니다.

콘솔조차도 프로세스입니다.

+0

명시 적으로 Std In을 검색하지 않고도 가능합니까? 커맨드 라인 버퍼가 너무 커서 클리어 할 수 없습니까? – jn1kk

+0

나는 회의적이다. 그러나 당신이 게시 한 글에서이 문제를 해결하기 위해 증명할 첫 번째 두 가지 질문이있다. 또한, 귀하의 프로그램은 어떻게 시작됩니까? 어떤 O/S와 JVM을 실행하고 있습니까? – jmehrens

+0

Windows 7 Home Premium 64bit. 최신 64 비트 JDK Std In으로 리디렉션 된 Std Err이있는 ProcessBuilder를 사용하여 프로세스를 시작했습니다. 나는 그 과정을 시작한 직후에 하나의 흐름을 읽었다. 나는 그 경고를 알고 있으며, 더 빨리 읽을 수있는 방법이 없다고 생각합니다. – jn1kk