1. 미들웨어이야기/01. JVM

Thread dump(Javacore) 분석 – lock connection

OSSW(Open Source System SoftWare 2009. 6. 8. 15:15

알다시피 Java Multi Threading 지원합니다. 경우 공유 영역을 보호하기 위해서 Synchronized method 이용하는데, 우리가 흔히들 말하는 Locking 이것입니다.

예를 들어 Thread1 Synchronized Method A Lock 잡고 있는 경우, 다른 쓰레드 들은 Method 수행하기 위해서, 앞에서 Lock 잡은 쓰레드가 Lock 반환하기를 기다려야 한다.


[
그림1]. Thread lock 기다리는 형태

만약에 Thread 1 MethodA 수행시간이 아주 길다면 Thread 2,3,4 마냥 수행을 아주 오랜 시간 기다려야 하고, 다음 2번이 Lock 잡는다고 해도 3,4 Thread들은 1번과 2 쓰레드가 끝난 시간 만큼의 시간을 누적해서 기다려야 하기 때문에, 수행시간이 매우 느려지는 현상을 겪게 됩니다.

이처럼 여러 개의 Thread 하나의 Lock 동시에 획득하려고 하는 상황을 Lock Contention 이라고 합니다.



[
그림2].Lock Contention 상황에서 Thread 시간에 따른 진행형태

이런 상황에서 Thread Dump 추출해보면 그림2 같은 형태를 띠게 됩니다.



[
그림3]. Lock Contention에서 Lock 기다리고 있는 상황의 Thread Dump>

그림3 덤프를 보면 12 Thread org.apache.axis.utils.XMLUtils. getSAXParser에서 Lock 잡고 있는 것을 있고, 13,14,15 쓰레드들이 Lock 기다리고 있는 것을 있습니다.

해결방안

이런 Lock Contention 상황은 Multi Threading환경에서는 어쩔 없이 발생하는 상황이기는 하지만, 이것이 문제가 되는 경우는 Synchronized Method 실행 시간이 불필요하게 길거나, 불필요한 Synchronized문을 사용했을 발생합니다.

그래서 문제를 해결하기 위해 불필요한 Synchronized Method 사용을 자제하고, Synchronized block 안에서의 최적화된 Algorithm 사용하는 것이 필요합니다.