스택
는 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);
}
}
위의 예에서는 변수 ref1이 참조하는 StringBuilder 객체를 만든 다음 해당 내용을 작성합니다. 그 StringBuilder 객체는 이후에 그것을 사용하는 것이 없기 때문에 즉시 가비지 수집에 적합합니다. 그런 다음 ref2 변수가 참조하는 또 다른 StringBuilder를 만들고 해당 참조를 ref3에 복사합니다. 해당 시점 이후에 ref2가 사용되지 않더라도 ref3은 동일한 StringBuilder 객체를 유지하여 ref3 사용을 완료 할 때까지 수집 대상이되지 않도록합니다.
값 유형 인스턴스 (및 개체 참조)는 변수가 선언 된 모든 위치에 있습니다. 인스턴스가 클래스 유형 내의 필드 또는 배열 요소로 선언 된 경우 해당 인스턴스는 힙에 있습니다.