8

Я не могу понять немного вещей в коллекции Мусора.Сбор мусора

Во-первых, как распределено пространство данных? т. е. на стеке или куче (по моим сведениям, всем статическим или глобальным переменным присваивается пространство в стеке, а локальным переменным присваивается пространство в куче).

Во-вторых, GC работает с данными на стеках или кучах? например, алгоритм GC, такой как Mark/Sweep, будет ссылаться на данные о стеке, если root установлен правильно? А затем сопоставьте все доступные переменные в куче, проверив, какие переменные в куче относятся к корневому набору.

Что делать, если программа не имеет глобальной переменной? Как работает алгоритм?

С уважением, Смуглянка

+2

Вы спрашиваете о конкретной сборщике платформы/мусора? Пожалуйста, отредактируйте свои теги и/или вопрос, чтобы быть более конкретными. – Jay

+0

Это вообще ... Говоря со ссылкой на Википедию: http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29 –

ответ

11

Это может помочь выяснить, что самой платформы GC вы просите о - JVM, CLR, Lisp и т.д. Это сказал:

Во-первых, чтобы сделать шаг назад, некоторые локальные переменные обычно выделяются в стеке. Однако специфика может варьироваться в зависимости от языка. Чтобы взять C# в качестве примера, в стек хранятся только локальные Value Types и параметры метода. Так, в C#, foo будет выделено на стеке:

public function bar() { 
    int foo = 2; 
    ... 
} 

В качестве альтернативы, динамически выделенные переменные используют память из кучи. Это должно быть интуитивно понятным, поскольку в противном случае стек должен динамически расти каждый раз, когда вызывается new. Кроме того, это означало бы, что такие переменные могут использоваться только как локальные локальные функции, которые их распределяют, что, конечно, не так, потому что мы можем иметь (например) переменные-члены класса. Таким образом, чтобы взять другой пример из C#, в следующем случае result выделяется в куче:

public class MyInt 
{   
    public int MyValue; 
} 

... 
MyInt result = new MyInt(); 
result.MyValue = foo + 40; 
... 

Теперь с этим фоном в виду, память на кучного является сборщиком мусора. Память в стеке не нуждается в GC, так как память будет возвращена, когда текущая функция вернется. На высоком уровне алгоритм GC работает, отслеживая все объекты, которые динамически выделяются в куче. После выделения через new объект будет отслеживаться GC и собираться, когда он больше не находится в области видимости, и больше нет ссылок на него.

+0

Большое спасибо. Это значительно упрощает понимание –

+0

«Чтобы взять C#, в стек хранятся только типы значений». - это не совсем правильно. Цитируя «C# In Depth», стр. 52: «... значение переменной живет там, где оно объявлено, поэтому, если у вас есть класс aa с переменной экземпляра типа int, значение этой переменной для любого заданного объекта всегда будет там, где остальная часть данные для объекта - в куче ... Только локальные переменные и параметры метода живут в стеке ... » – duffymo

+1

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

2

Во-первых, как распределено пространство? т. Е. На стек или кучу (согласно моим знаниям, всем статическим или глобальным переменным присваивается пространство в стеке , а локальным переменным присваивается пространство на куче).

Нет, переменные стека - это вызовы методов и локальные переменные. Фрейм стека создается при вызове метода и выталкивается при его возврате.

Память в Java и C# выделяется в куче, вызывая «новое».

Во-вторых, GC работает на данных по стекам или кучи? например, алгоритм GC, такой как . Марк/развертка будет ссылаться на данные на стеке , так как root установлен правильно?А затем сопоставьте все доступные переменные в куче , проверяющие, какие переменные в куче ссылаются на корневой набор.

GC используется в куче.

Марк и развертка не будут считаться алгоритмом GC режущей кромки. Как Java, так и .NET GC теперь используют модели поколений.

Что делать, если программа не имеет глобальной переменной ? Как работает алгоритм ?

Что означает «глобальная переменная» в таких языках, как Java и C#, где все принадлежит классу?

Корень графа объекта произвольный. Я признаю, что не знаю, как это выбрано.

+0

Большое вам спасибо .. это многое объясняет мне. –

1

Прочитано this article. Это очень хороший обзор по однопроцессорным методам сбора мусора. Это даст вам основное понимание и терминологию на GC. Затем следуйте за книгой Джонса и Линса «Сбор мусора: алгоритмы автоматического управления динамической памятью». Вопреки обзорной статье, о которой я указываю выше, книга не доступна бесплатно в Интернете; вы должны купить его; Но оно того стоит.

0

Вы можете найти краткое описание Garbage Collection on the Memory Management Reference полезной.

В конечном счете, сбор мусора должен начинаться с регистров процессора (процессоров), поскольку любые объекты, которые не могут быть достигнуты процессором, могут быть переработаны. В зависимости от языка и системы времени выполнения имеет смысл предположить, что статики также могут достигать стеки и регистры потоков, а также «глобальные переменные».

Стеки, вероятно, получают локальные переменные. Таким образом, в простых GC вы начинаете с сканирования контекстов потоков, их стеков и глобальных переменных. Но это, конечно, не так. Некоторые языки не используют стеки или имеют глобальные переменные как таковые. Более того, GC могут использовать barrier, так что им не нужно каждый раз смотреть на каждый стек или глобальный. Некоторые специализированные аппаратные средства, такие как Symbolics Lisp Machine, имели барьеры на регистрах!