Unity / C# 값형, 참조형, 스택, 힙, 가비지컬렉션 GC(이론)

목차

1. 밸류타입과 레퍼런스타입의 개념

값 유형(값):

참조 유형(페퍼런스):

힙의 참조 유형과 스택의 값 유형입니까?

2. 값 유형과 참조 유형의 차이점은 무엇입니까

3. 힙과 스택은 무엇입니까? 

스택

더미

4. 가비지 컬렉터(GC)


면책 조항: 이 콘텐츠는 다양한 자료 및 개인 요약에서 가져옵니다.

1. 밸류타입과 레퍼런스타입의 개념

값 유형(값):

int float bool  구조체  열거(열거형) 등

참조 유형(페퍼런스):

클래스 배열은 요소가 값 타입이더라도 참조입니다.(int[]는 참조입니다.) 대리자(delegate)는 참조입니다. 인터페이스(interface)는 참조이지만 값으로 구현할 수 있습니다. 유형 등

힙의 참조 유형과 스택의 값 유형입니까?

  1. 항상 힙에 있는 유형의 인스턴스를 참조하는 데 아무런 문제가 없지만 메서드 내부에 선언된 변수 및 메서드 매개 변수는 스택에 있습니다. 그리고 인스턴스 변수의 값은 항상 인스턴스 자체가 저장된 곳에 저장됩니다. 예를 들어 클래스에 int 변수가 있으면 값 유형이지만 힙에 있습니다.
  2. 참조 유형의 변수에는 변수와 직접 연결된 저장 위치와 변수에 저장된 값이 참조하는 저장 위치의 두 가지 저장 위치가 포함됩니다.
  3. 변수와 직접 연결된 저장 위치와 값 유형 변수와 연결된 저장 위치의 경우 저장 위치에는 차이가 없습니다. 즉, 참조 자체는 값 유형과 동일합니다. 잠시 후 스택의 임시 스토리지 풀에 할당됩니다. .

2. 값 유형과 참조 유형의 차이점은 무엇입니까

  1. 할당 후 두 값이 동기적으로 변경되는지 여부의 차이, 값 유형이 할당되고 독립적입니다. 참조형은 할당 후 하나가 되며, 한쪽이 변경되면 다른 쪽도 변경됩니다. 

3. 힙과 스택은 무엇입니까? 

  • 스택

스택은 메모리에 예약된 특별한 공간으로, 작고 단기적인 데이터 값을 저장하는 데 특별히 사용되며 기능을 초과하면 자동으로 해제되므로 스택이라고 합니다. 데이터 구조의 스택과 마찬가지로 메모리 스택에도 푸시 및 팝이 있습니다.
선언된 모든 지역 변수(예: int a;)는 스택에 배치되며 해당 로드 및 언로드는 함수가 호출될 때 처리됩니다. 즉, 변수는 프로그램이 실행되기 전에 스택에 정의되었습니다. 이러한 함수 호출은 소위 호출 스택을 통해 확장 및 축소되며, 현재 함수에 대한 호출 스택 처리가 완료되면 호출 스택 이전의 호출 지점으로 다시 점프하고 남은 위치에서 나머지 내용을 계속 실행합니다. 전에. 이전 메모리 할당 위치는 항상 알려져 있으며 새 메모리 할당이 이전 데이터를 덮어쓰므로 메모리 정리 작업을 수행할 필요가 없으므로 스택이 상대적으로 효율적입니다.
스택의 총 크기는 일반적으로 메가바이트(MB) 정도로 작습니다. 스택이 지원할 수 있는 것보다 더 많은 공간을 할당하면 스택 오버플로가 발생할 수 있는데, 이는 무한 루프와 같은 많은 수의 호출 스택을 실행할 때 또는 많은 수의 로컬 변수가 있을 때 발생하지만 대부분의 경우 비교적 작은 스택 크기에도 불구하고 스택 오버플로가 거의 발생하지 않습니다.

  • 더미

힙은 다른 모든 메모리 공간을 나타내며 대부분의 메모리 할당**에 사용됩니다. 우리는 대부분의 메모리 할당이 현재 함수 호출보다 오래 유지되기를 원하기 때문에 스택에 할당할 수 없습니다. 스택이 메서드 실행이 끝나기 전후에 생성된 결과를 덮어쓰기 때문입니다. 데이터 유형이 때때로 너무 크거나 함수 외부에 보관해야 하기 때문에 힙이 있습니다. 물리적으로 힙과 스택 사이에는 차이가 없으며 둘 다 RAM에 존재하는 데이터 바이트를 포함하는 메모리 공간일 뿐입니다. 운영 체제는 이러한 데이터 바이트를 요청하고 저장합니다. 차이점은 언제, 어디서, 어떻게 사용하느냐입니다.
C++로 작성된 언어와 같은 네이티브 코드에서 이러한 메모리 할당은 수동으로 처리되며 모든 메모리 블록이 올바르게 할당되었는지 확인하고 필요하지 않을 때 명시적으로 메모리를 해제하는 것은 우리의 책임입니다. 그렇지 않으면 메모리가 부족하여 프로그램이 충돌할 때까지 메모리 누수를 일으키기 쉽습니다.
관리되는 언어에서 메모리 해제는 가비지 컬렉터에 의해 자동으로 처리됩니다. Unity 프로그램을 초기화하는 동안 Mono 플랫폼은 운영 체제에서 메모리 문자열을 적용하여 사용할 힙 메모리 공간(일반적으로 관리되는 힙이라고 함)을 생성합니다. C# 코드로. 이 힙 공간은 1MB 미만의 상대적으로 작게 시작하지만 스크립트 코드가 새로운 메모리 청크를 필요로 함에 따라 커집니다. Unity가 더 이상 필요하지 않은 경우 OS에 다시 해제하여 해당 공간을 줄일 수 있습니다.

4. 가비지 컬렉터(GC)

가비지 수집기(GC)는 관리되는 메모리가 필요 이상으로 사용되지 않도록 하고 더 이상 필요하지 않은 메모리는 자동으로 회수되도록 하는 중요한 작업을 수행합니다. 즉, GC는 객체 생성 및 소멸에 참여하게 됩니다. 예: GameObject를 생성한 다음 제거하는 경우 GC는 나중에 이 메모리를 회수할 수 있도록 개체에서 사용하는 메모리 공간을 표시합니다. 메모리 복구는 실시간이 아니지만 메모리는 필요하지 않을 때만 복구됩니다.

Unity에서 사용하는 Mono 버전의 GC는 표시 및 스윕 전략을 사용하는 추적 GC입니다. 알고리즘은 두 단계로 나뉩니다.

할당된 각 개체는 추가 데이터 비트로 추적됩니다. 이 데이터 비트는 개체가 표시되었는지 여부를 나타냅니다. 이러한 플래그는 플래그가 지정되지 않았음을 나타내는 false로 설정됩니다. 수집 프로세스가 시작되면 개체의 플래그 Alive를 true로 설정하여 프로그램에서 계속 액세스할 수 있는 모든 개체를 표시합니다. 액세스 가능한 객체는 직접 참조(예: 스택의 정적 또는 로컬 변수)이거나 직접 또는 간접적으로 액세스 가능한 다른 객체의 필드(멤버 변수)를 통한 간접 참조입니다. 이론적으로 참조되지 않은 모든 객체는 재활용되어야 합니다.
두 번째 단계는 이러한 참조(GC가 프로그램 수명 동안 추적함)를 반복하고 표시 상태에 따라 재활용 여부를 결정하는 것입니다. 개체에 표시가 없으면 수집 후보로 간주됩니다. 이 단계는 표시된 객체를 직접 건너뛰지만 다음 가비지 수집 스캔 전에 false로 재설정하여 새로운 표시 라운드를 완료합니다.
2단계 수행이 종료되면 unmarked 모든 객체를 정식으로 회수하여 공간을 확보한 후 객체 생성을 위한 사고 요청을 재방문하고, GC에서 충분한 공간을 확보했다면 새로 확보한 공간에 메모리를 할당하고 다시 방문객. 해제된 공간이 충분하지 않은 경우 시스템에서 더 많은 관리되는 힙만 신청할 수 있습니다.

실제로 GC는 메모리의 모든 개체 목록을 유지 관리하는 반면 응용 프로그램은 일부만 포함하는 별도의 목록을 유지 관리합니다. 프로그램이 개체에 대해 완료되자마자 개체가 재활용되어야 하는지 여부에 관계없이 개체가 존재한다는 사실을 잊어버리고 목록에서 제거합니다. 즉, 가비지 수집 작업은 GC에 의해 독립적으로 수행되며 프로그램은 자체 개체 목록만 유지하면 됩니다.

게임은 높은 성능을 요구하는데 효율성을 높이기 위해 장면이 전환되거나 리소스를 자주 사용하지 않을 때 GC를 호출할 수 있습니다.

추천

출처blog.csdn.net/q1295006114/article/details/130915670