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

Thread dump(Javacore) 분석 – Dead Lock

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

Locking 의해서 발생 있는 다른 문제는 dead lock 현상입니다. 두개 이상의 Thread 서로 lock 잡고 기다리는 환형대기조건 성립되었을 서로 lock 풀리지 않고 무한정 대기하는 현상을 이야기 합니다.

그림 1 보면 Thread1 methodA 수행하고 있는데, synchronized methodB 호출하기 전에 Thread2 methodB 끝나기를 기다리고 있습니다. 마찬가지로 Thread2 Thread3 수행하고 있는 methodC 끝나기를 기다라고 있고, methodC 에서는 Thread1에서 수행하고 있는 methodA 끝나기를 기다리고 있습니다. 각각의 메소드들이 서로 끝나기를 기다리고 있는 환형 대기조건이기 때문에 application 3개의 쓰레드들은 프로그램이 진행되지 않게 됩니다.



[
그림1]. 환형 대기조건에 의한 deadlock

이러한 환형대기조건 의한 deadlock Thread Dump 추출해 보면 그림2 같은 패턴을 띄우고 있으며 시간이 지나도 풀리지 않습니다.


[
그림 2]. DeadLock 걸렸을 시간진행에 따른 Thread 상태



[
그림 3]. Deadlock 걸린 IBM AIX Thread Dump

DeadLock 검출은 Locking Condition 비교함으로써 검출 있으며, 최신 JVM들에서는 Thread Dump 추출 만약 DealLock 있다면 해당 DeadLock 찾아 주는 기능을 가지고 있습니다. 그림 3에서 1)항목을 보면 현재 8 쓰레드가 잡고 있는 Lock 10번과 6 쓰레드가 기다리고 있음을 있으며, Lock OracleConnection 의해서 잡혀 있음을 확인 있습니다.


그림 3 2) 항목을 보면 6 쓰레드는 OracleStatement에서 Lock 잡고 있는데, Lock 8 쓰레드가 기다리고 있습니다.


결과적으로 6번과 8번은 서로 Lock 기다리고 있는 상황이 되어 Lock 풀리지 않는 Dead Lock 상황이 됩니다.

해결방안

Dead Lock 해결 방안은 서로 Lock 보고 있는 것을 다른 Locking Object 사용하거나 Lock 방향(Synchronized call 방향) 바꿔줌으로써 해결 있습니다. User Application에서 발생한 경우에는 synchronized method 호출 순서를 환형 대기조건 생기지 않도록 바꾸도록 하고, 위와 같이 Vendor들에서 제공하는 코드에서 문제가 발생한 경우에는 Vendor 패치를 요청하여 해결 하도록 해야 합니다.