2013-10-02 5 views
-1

Из того, что я читаю, GC начинается с «root» и следует и маркирует все живые объекты, прежде чем GC запускает развертку. Но я не совсем уверен, что составляет корень. Например, в приведенном ниже коде метод Main запускает поток и существует. Итак, когда GC начинается, как он узнает, какую часть выбрать в качестве корня?Где начинается сборщик мусора?

  static void Main() 
     { 

      var thread = new Thread(SomeLongRunningProcess); 
      thread.Start(); 

     } 

     static void SomeLongRunningProcess() 
     { 


     } 
+0

Это могло бы помочь, если бы вы могли объяснить основную проблему, которую вы пытаетесь решить, чтобы слова: _why_ вы хотите знать? – CodeCaster

+4

Эта статья [MSDN] (http://msdn.microsoft.com/en-us/magazine/bb985010.aspx) объясняет почти все, что вам нужно знать о GC. Часть «Алгоритм сбора мусора» связана с вашим вопросом. –

+0

есть много материалов по этой теме в google, как это http://www.csharphelp.com/2006/08/garbage-collection/ –

ответ

5

Корней включают

  • статических поля (все статические поля всех типов во всех сборках, загруженных для каждого AppDomain в процессе)
  • локальных переменных (в том числе в регистрах процессора, для каждого thread)
  • f-достижимая очередь (список объектов, имеющих финализатор)
  • очередь финализации (список объектов, иначе мусор, но ожидающих завершения)
+0

1> Статические переменные какого объекта? Что делать, если этот класс никогда не вызывался? 2> Локальные переменные в методе точки входа? 3> Я не уверен, что список объектов, имеющих финализатор, представляет собой корень. Это может стать живым объектом, но не обязательно корнем. – Foo

+1

Я буду более откровенным о статических полях, но я не понимаю, что вы спрашиваете о локальных переменных. Все локальные переменные в каждом стеке являются корнями, как только они существуют, и остаются корнями, пока они больше не существуют. Очередь f-достижимая, безусловно, является корнем. Все объекты, на которые он ссылается, не могут быть собраны в мусор, пока они не будут завершены. –

+2

@Foo Вы, кажется, путаетесь, что есть один корень. Нет. Есть много объектов, которые квалифицируются как корневые объекты. –

Смежные вопросы