2013-02-07 4 views
1

Java (웹) 응용 프로그램은 JBoss 6x에서 실행됩니다. 는 속도 저하가보고되었을 때 :로거에서 차단 된 Java 스레드

  1. 스레드 스택 덤프는
  2. 메모리를 조사 하였다 (아래 세부 사항)를 촬영했다 - 메모리 사용량이 거의 최대 힙 크기를 허용 접촉, 매우 높은 것으로 판명,하지만 메모리의 어떤 부족했다.

스레드 스택 덤프 오류가 이러한 종류의 로깅에서 차단 대부분의 스레드를 보여줍니다

waiting for monitor entry [0x000000004b6be000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at org.jboss.logmanager.handlers.WriterHandler.doPublish(WriterHandler.java:59) 
    - waiting to lock <0x00002aaac9a2de68> (a java.lang.Object) 
    at org.jboss.logmanager.ExtHandler.publish(ExtHandler.java:64) 

을 그리고 다음과 같이 :

java.lang.Thread.State: BLOCKED (on object monitor) 
    at java.io.PrintStream.println(PrintStream.java:756) 
- waiting to lock <0x00002aaac9817a08> (a com.whatever.SomeClass) 
at com.something.ThatClass.thatMethod(ThatClass.java:169) 

com.whatever.SomeClass는 org.apache를 사용 .log4j.Logger
Log4j를 로깅 용으로 사용합니다.

일부 로깅 작업에서 스레드가 모두 차단 된 것처럼 보입니다. 이 문제는 과거에도 발생했으며 무작위 적으로 나타나고 응용 프로그램의 속도가 느려지거나 중지됩니다.

아이디어가 있으십니까?

+0

.log 파일의 모든 파일 작업이 동시에 수행 될 수 있습니다. – TheWhiteRabbit

+0

최근 log4j.xml의 RollingFileAppender에 대해 MaxBackupIndex 크기가 1000으로 설정되었습니다 (MaxFileSize는 5MB 임). MaxBackupIndex에 대한 그런 높은 가치가이 우려/문제의 원인이 될 수 있습니까? - – Jasper

답변

2

재 스퍼 (Jasper)의 모든 로깅 프레임 워크는 데이터를 디스크에 쓰는 동기화 된 블록을 가지고 있습니다. 이것은 하나 이상의 쓰레드가 로그에 쓰고있을 때 로그가 깨지는 것을 방지하기위한 것입니다 (예를 들어 java.io.PrintStream.println에 BLOCKED 쓰레드를 게시했습니다).

하지만 해결 방법은 asynchronous appender입니다. 직장에서 우리는 높은 처리량/낮은 대기 시간 응용 프로그램을 가지고 있으며, 스레드 경합을 막기 위해이를 구성해야했습니다.

비동기 애플릿을 사용할 때 고려해야 할 사항 중 하나는 응용 프로그램이 강제 종료되거나 강제 종료 된 경우 로그에 마지막 로깅 구문이 표시되지 않는다는 것입니다. 디스크에 기록됩니다.

+1

AsyncAppender 문제 및 팁에 대한 자세한 내용은 http://stackoverflow.com/a/13144054/603516을 참조하십시오. – Vadzim

+0

대부분의 로깅 프레임 워크에는 로그 항목이 로그 쓰 기 스레드에 대기중인 동기화 된 블록이 있습니다. 완전한 디스크 쓰기 작업을 잠그는 것은 매우 어려울 것입니다. –

+0

Martin, Async appender를 사용하는 경우에만 해당됩니다. 일반 File 또는 Console appender를 사용하면 로깅 프레임 워크가 다른 모든 로깅 작업을 동 기적으로 차단합니다. 이것이 비동기식 appender가 다른 appender를 둘러싼 이유입니다. – Augusto