Garbage Collection (GC)

2021. 6. 1. 00:39Study/Unity

메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다. 
즉, 동적 할당된 메모리 영역 가운데 어떤 변수도 가리키지 않는 메모리 영역을 탐지하여 자동으로 해제하는 기법이다. 

기본적으로 C#은 메모리를 자동적으로 관리 해준다.

C# 메모리 구조 : https://everyday-devup.tistory.com/10?category=934756 

 

[Unity] C#에서의 메모리

* Heap ▶ 위치가 정해져 있지 않고 용량이 큰 대신 느림 ▶ 참조 타입 ( ex class, string, object ) ▶ 변수 선언 시 데이터가 저장되어있는 메모리를 가리키게 됨 * Stack ▶ 정렬되어 있고 빠르지만 사

everyday-devup.tistory.com

 

기본적으로 프로세스의 메모리 구조는 다음과 같다.

  • Stack
    • 프로그램이 자동으로 사용하는 임시 메모리 영역으로 지역변수, 매개변수, 리턴 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역.
    • 함수 호출 시 생성되고 함수가 끝나면 반환된다.
    • LIFO
  • Heap
    • 필요에 의해 메모리를 동적 할당하고자 할 때 사용하는 메모리 영역
    • 동적 데이터 영역
    • 메모리 주소 값에 의해서만 참조되고 사용하는 영역이다.
  • Data
    • 전역변수, 정적 변수, 배열, 구조체 등이 저장된다.
  • Code
    • 코드 자체를 구성하는 메모리 영역

Unity에서의 힙 메모리 사용은 2가지로 나누어진다.

  • Native Heap : C++로 작성된 유니티 엔진에서 사용하는 메모리
    • Texture, Asset, Mesh와 같은 것을 담고 있음.
    • 씬 전환이 발생할 때 위의 요소들이 사용되지 않으면 자동으로 메모리를 해제한다.
  • Managed Heap : Mono에서 관리하는 메모리로 Script에서 할당한 class, string과 같은 요소들을 담고 있음.
    • GC는 Managed Heap에서만 실행된다.
    • C#은 선형적인 Heap을 가지고 있으며, 메모리 할당을 위한 포인터만을 가지고 있다.
    • 메모리 할당이 필요할 경우 필요한 메모리만큼 증가시키고 포인터를 증가된 크기만큼 이동시킨다.
    • 할당을 위한 충분한 메모리가 없을 경우 GC가 호출되고, GC가 호출됨에도 메모리가 없을경우 Heap이 확장된다.
    • 사용 공간이 부족할 경우 앱이 종료된다.

 

Unity GC 최적화 (참조 : https://docs.unity3d.com/kr/2018.4/Manual/UnderstandingAutomaticMemoryManagement.html)

  • GC 호출 시기를 짧은 주기로 반복적으로 실행
    • 필요 이상으로 호출된다는 단점이 있지만, 짧은 주기로 실행이되므로, 쌓인 메모리가 적어 GC의 실행속도가 빠르다.
      • IOS의 일반적 힙 크기는 200KB - 5ms의 시간이 소모됨. 1MB 기준으로 7ms이 소모된다.
  • 초기에 큰 Heap을 설정한다.(강제로 큰 배열을 만든다.)
  • Object Pool
    • 반복적으로 생성/삭제되는 게임 오브젝트를 Pool로 관리함으로써 최소한의 오브젝트 생성으로 메모리를 관리한다.
  • 일정 프레임에 도달했을 때 실행

'Study > Unity' 카테고리의 다른 글

Unity - Physics  (0) 2022.08.21
Sprite Atlas - 스프라이트 아틀라스  (1) 2021.11.16
(C#) Coroutine  (0) 2021.05.31
(C#) Virtual / Abstract / Interface  (0) 2021.05.31
데이터 저장하기  (0) 2020.09.19