Это может помочь уточнить, о какой платформе GC вы спрашиваете - JVM, CLR, Lisp и т. Д. Это говорит:
Сначала, чтобы сделать шаг назад, определенные локальные переменные обычно располагаются в стеке. Однако специфика может отличаться в зависимости от языка. Чтобы взять C # в качестве примера, в стеке хранятся только локальные типы значений и параметры метода. Таким образом, в 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;
...
Теперь, имея в виду этот фон, память в куче 1015 * собирается мусором. Память в стеке не нуждается в GC, так как память будет возвращена, когда текущая функция вернется. На высоком уровне алгоритм GC работает, отслеживая все объекты, которые динамически размещаются в куче. После выделения через new
объект будет отслеживаться GC и собираться, когда он больше не находится в области видимости и на него больше нет ссылок.