2011-10-28 65 views
3

我在我的類中有一個靜態變量,當我通過windbg/sos查看此對象時,它將此對象顯示爲固定。我認爲這意味着GC無法在其他地方分配這個對象。任何想法爲什麼靜態變量被視爲固定?靜態對象被固定並且不能被GC重新分配?

下面是這個變量的聲明在我班上

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

,這裏是輸出形式的WinDbg

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) 

見!gcroot的輸出,這是顯示爲手柄(銷接) 。我誤讀這個輸出嗎?

+3

這是不正確的一般。 – SLaks

+0

爲什麼windbg節目是PINNED呢? –

+0

你能顯示WinDbg輸出嗎? – vcsjones

回答

4

字符串固定的原因不是因爲您有靜態引用,而是因爲您有字符串文字。字符串文字是默認實現的,因此你會看到它們是固定的。請參閱this question

相關問題