Thread dump(Javacore) 분석 – lock connection
알다시피 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을 사용하는 것이 필요합니다.