Статические объекты закреплены и не могут быть перераспределены GC? - PullRequest
3 голосов
/ 28 октября 2011

У меня есть статическая переменная в моем классе, когда я смотрю на этот объект через windbg / sos, он показывает этот объект как закрепленный. Я предполагаю, что это означает, что 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 это отображается как HANDLE (PINNED). Я неправильно читаю этот вывод?

1 Ответ

4 голосов
/ 13 декабря 2011

Причина закрепления строки не в том, что у вас есть статическая ссылка, а в том, что у вас есть строковый литерал.Строковые литералы интернированы по умолчанию, поэтому вы увидите их закрепленными.Пожалуйста, смотрите этот вопрос .

...