2011-10-28 7 views
3

クラスに静的変数があります。このオブジェクトをwindbg/sos経由で見ると、このオブジェクトが「固定」として表示されます。私はこの平均的なGCがどこにでもこのオブジェクトを割り当てることができないと仮定します。静的変数が固定されたものとして扱われる理由は?ここで静的オブジェクトは固定されており、GCによって再割り当てできません。

は、私のクラスでは、この変数の宣言

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

であり、ここで、出力形式は、これはHANDLE(ピン)として表示され

!のgcrootの出力で
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のです。この出力を誤解していますか?

+3

一般的にはそうではありません。 – SLaks

+0

なぜwindbgがPINNEDとして表示されるのですか? –

+0

WinDbgの出力を表示できますか? – vcsjones

答えて

4

文字列が固定されている理由は、静的な参照があるためではなく、文字列リテラルがあるためです。文字列リテラルは既定で内部に格納されているため、固定されたものとして表示されます。 this questionもご覧ください。

関連する問題