Стек
Это stack
блок памяти для хранения local variables
и parameters
. Стек логически увеличивается и уменьшается при входе в функцию и выходе из нее.
Рассмотрим следующий метод:
public static int Factorial (int x)
{
if (x == 0)
{
return 1;
}
return x * Factorial (x - 1);
}
Этот метод рекурсивен, то есть вызывает сам себя. Каждый раз, когда вводится метод, в стеке выделяется новый int , и каждый раз, когда метод завершается, int освобождается .
Куча
- Куча - это блок памяти, в котором
objects
(т. reference-type instances
Е.) Находятся. Каждый раз, когда создается новый объект, он выделяется в куче, и возвращается ссылка на этот объект. Во время выполнения программы куча начинает заполняться по мере создания новых объектов. Среда выполнения имеет сборщик мусора, который периодически освобождает объекты из кучи, поэтому ваша программа не запускается Out Of Memory
. Объект имеет право на освобождение, как только на него не ссылается что-либо само по себе alive
.
- Куча тоже хранит
static fields
. В отличие от объектов, размещенных в куче (которые могут собираться сборщиком мусора) these live until the application domain is torn down
,.
Рассмотрим следующий метод:
using System;
using System.Text;
class Test
{
public static void Main()
{
StringBuilder ref1 = new StringBuilder ("object1");
Console.WriteLine (ref1);
StringBuilder ref2 = new StringBuilder ("object2");
StringBuilder ref3 = ref2;
Console.WriteLine (ref3);
}
}
В приведенном выше примере мы начинаем с создания объекта StringBuilder, на который ссылается переменная ref1, а затем записываем его содержимое. Этот объект StringBuilder сразу же получает право на сборку мусора, потому что впоследствии его ничто не использует. Затем мы создаем еще один StringBuilder, на который ссылается переменная ref2, и копируем эту ссылку в ref3. Несмотря на то, что после этого момента ref2 не используется, ref3 сохраняет тот же объект StringBuilder живым, гарантируя, что он не станет подходящим для сбора, пока мы не закончим использование ref3.
Экземпляры типов значений (и ссылки на объекты) живут везде, где была объявлена переменная. Если экземпляр был объявлен как поле внутри типа класса или как элемент массива, этот экземпляр живет в куче.