Garbage Collection (GC)
2021. 6. 1. 00:39ㆍStudy/Unity
메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다.
즉, 동적 할당된 메모리 영역 가운데 어떤 변수도 가리키지 않는 메모리 영역을 탐지하여 자동으로 해제하는 기법이다.
기본적으로 C#은 메모리를 자동적으로 관리 해준다.
C# 메모리 구조 : https://everyday-devup.tistory.com/10?category=934756
기본적으로 프로세스의 메모리 구조는 다음과 같다.
- 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이 소모된다.
- 필요 이상으로 호출된다는 단점이 있지만, 짧은 주기로 실행이되므로, 쌓인 메모리가 적어 GC의 실행속도가 빠르다.
- 초기에 큰 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 |