GC(Gabage Collector)에 의한 Hang 현상?

CLR 환경하에서 수행되는 Managed Application 경우, CLR에서 제공하는 GC Memory 관리해주는 Component . Application에서 Memory 할당 받을 , GC 적절한 memory 할당 받을 있는 확인한 후에, (보통은 할당 받을 있는 Memory Size 정도의 정보를 요청할지 모른다) 가능하다면, Memory 할당 하고, 그렇지 않을 경우에, 보통은 GC running 하게 된다. GC Memory Fragmentation 줄이기 위해 Compaction이나 Sweeping 같은 작업을 하거나 필요에 의해 추가적인 Segment 만들지도 모른다. 이러한 작업을 하는 동안에는 필요에 따라서 Threads 들을 suspension 한다. Thread suspended 된다는 것은 사용자 입장에서 보면, 작업이 멈춰진(Hang) 것으로 인식한다. 그러므로, GC 돌면, Hang 경험할 있다. Hang Dump 상에서는 다음과 같은 Callstack GC running 의해서 Wait 하고 있는 Threads들이라고 보면 된다.

 

0:033> kL

ChildEBP RetAddr 

18e9eb04 77e7a0a2 NTDLL!NtWaitForSingleObject+0xb

18e9eb2c 77e5b40f KERNEL32!WaitForSingleObjectEx+0x71

18e9eb3c 79208383 KERNEL32!WaitForSingleObject+0xf

18e9eb48 792083d4 mscorsvr!GCHeap::WaitUntilGCComplete+0x4f

18e9eb58 791fbd68 mscorsvr!Thread::RareDisablePreemptiveGC+0xb5

18e9ebec 17723675 mscorsvr!JITutil_MonContention+0xd7

WARNING: Frame IP not in any known module. Following frames may be wrong.

18e9ebf0 01f664f4 0x17723675

18e9ebf4 17b10f28 0x1f664f4

18e9ebf8 0d7c8dc4 0x17b10f28

18e9ebfc 01f66614 0xd7c8dc4

18e9ec00 18e9f8f8 0x1f66614

18e9ec04 0283a990 0x18e9f8f8

18e9f980 791c137c 0x283a990

18e9f98c 024c5f2c mscorsvr!COMString::EqualsString+0x3f

18e9f994 010eb9b2 0x24c5f2c

18e9f998 05e3534c 0x10eb9b2

18e9f99c 05e59638 0x5e3534c

18e9f9a0 05e3520c 0x5e59638

18e9f9a4 00000000 0x5e3520c

 

그리고, GC 뭔가 작업을 하고 있다면, 아래와 같은 Callstack 보일 수도 있다 (외에 Mark, Sweep, 기타 등등 GC 관련 Func Name ... ) 

 

28c9f438 791b7c1a mscorsvr!gc_heap::adjust_limit_clr+0x17c

28c9f474 791b7cb4 mscorsvr!gc_heap::allocate_more_space+0x47e

28c9f69c 791bb333 mscorsvr!GCHeap::Alloc+0x7b

28c9f6b0 791b7579 mscorsvr!Alloc+0x3a

28c9f6d0 791b751a mscorsvr!FastAllocatePrimitiveArray+0x45

28c9f750 0c2d7ab6 mscorsvr!JIT_NewArr1+0xbb

WARNING: Frame IP not in any known module. Following frames may be wrong.

28c9f754 28c9f7a8 0xc2d7ab6

28c9f758 053faa7c 0x28c9f7a8

28c9f7a8 1713517d 0x53faa7c

28c9f8c8 7923cd4b 0x1713517d

28c9f93c 792403e6 mscorsvr!ComToComPlusWorker+0x1e0

28c9f97c 791cf976 mscorsvr!ComToComPlusWorker_Wrapper+0x38

28c9f9c4 7923ff03 mscorsvr!Thread::DoADCallBack+0x5c

28c9fa2c 0126a0bd mscorsvr!ComToComPlusWorker+0x65

28c9fb74 77fb2c8a 0x126a0bd

28c9fba0 77fcb7c2 NTDLL!RtlpFreeToHeapLookaside+0x4a

28c9fc44 00000000 NTDLL!RtlFreeHeap+0xf8

 

만일, 대부분의 Threads GCHeap::WaitUntilGCComplete 상태로 있다면, 이는 GC running 끝날 때까지 대부분의 Threads 기다리고 있다는 의미이므로, 얼마나 상태가 지속되고 있는 Check 필요가 있다. 그리고, Hang 상태가 User 견디기 어려울 정도라면, GC thread Check하여 GC thread 오랫동안 수행되고 있는 지를 확인하는 것이 좋을 것이다. GC heap corruption(!verifyheap check) 되었거나, Thread Looping code 갖고 있거나(!clrstack check) 또는 GEN2 Object 대량으로 쌓여있어서 GC Collection 하는 , 시간이 걸릴(!dumpheap check) 밖에 없을 수도 있다.

by 강세윤 | 2008/12/12 12:48 | Windows debugging | 트랙백 | 덧글(0)
트랙백 주소 : http://byung.egloos.com/tb/4769172
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >