2011-10-28 1 views
3

클래스에 정적 변수가 있습니다.이 객체를 windbg/sos를 통해 보면이 객체가 고정 된 것으로 표시됩니다. 나는이 평균 GC가이 객체를 다른 곳에 할당 할 수 없다고 가정합니다. 정적 변수가 고정 된 것으로 취급되는 이유는 무엇입니까? 여기 정적 개체가 고정되어 있으며 GC에서 다시 할당 할 수 없습니까?

내 클래스

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static string Name = "Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; 
    } 
} 

을이 변수의 선언이며, 여기

0:004> !do 0231bb70 
Name:  System.String 
MethodTable: 6c97f92c 
EEClass:  6c6b8ba0 
Size:  418(0x1a2) bytes 
File:  C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll 
String:  Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  
Fields:  
     MT Field Offset     Type VT  Attr Value Name 
6c9828f8 4000103  4   System.Int32 1 instance  202 m_stringLength 
6c981d48 4000104  8   System.Char 1 instance  41 m_firstChar 
6c97f92c 4000105  8  System.String 0 shared static Empty 
    >> Domain:Value 004f6588:02311228 << 
0:004> !gcroot 0231bb70 
Scan Thread 0 OSTHread 2824 
Scan Thread 2 OSTHread 1ae0 
DOMAIN(004F6588):HANDLE(Pinned):1613f4:Root: 03312020(System.Object[])-> 
    0231bb70(System.String) 
DOMAIN(004F6588):HANDLE(Pinned):1613fc:Root: 03311010(System.Object[])-> 
    0231bb70(System.String) 

windbg를 출력 양식이이 핸들로 표시됩니다!의 gcroot의 출력에 참조입니다 (고정) . 이 출력물을 잘못 읽었습니까?

+3

일반적으로 사실이 아닙니다. – SLaks

+0

왜 windbg가 PINNED로 표시됩니까? –

+0

WinDbg 출력을 표시 할 수 있습니까? – vcsjones

답변

4

문자열을 고정하는 이유는 정적 참조가 있기 때문이 아니라 문자열 리터럴을 가지고 있기 때문입니다. 문자열 리터럴은 기본적으로 금지되어 있으므로 고정 된 것으로 간주됩니다. this question도 참조하십시오.

관련 문제