Unity 관리되는 메모리 시스템
이 문서는 Unity의 관리되는 메모리 시스템에 대해 설명하고, 메모리 관리의 장단점을 다룹니다. 또한 자동 메모리 관리와 관련된 개념을 살펴보며, 다양한 활용 및 응용 예제를 제공합니다.
1. 관리되는 메모리 시스템
Unity의 메모리 관리 시스템은 Mono 또는 IL2CPP 가상 머신(VM) 기반의 C# 스크립팅 환경입니다. 이 시스템의 주요 장점은 메모리 해제를 자동으로 수행하여 개발자가 수동으로 메모리를 해제할 필요가 없다는 것입니다.
주요 특징:
- 가비지 컬렉터: 사용되지 않는 객체의 메모리를 자동으로 해제.
- 메모리 보호: 해제되거나 더 이상 유효하지 않은 메모리 접근 방지.
- 런타임 성능: 관리된 메모리 할당 과정에서 성능 저하가 발생할 수 있음.
2. 값 타입과 레퍼런스 타입
C#에서는 데이터 타입이 두 가지로 나뉩니다: - 값 타입: 직접적인 데이터를 저장. 예: int
, float
- 레퍼런스 타입: 객체에 대한 참조를 저장. 예: string
, array
메서드 호출 검토
메서드가 호출되면 해당 파라미터 값이 호출 스택에 복사됩니다. 값 타입의 경우 복사가 쉽지만, 레퍼런스 타입은 더 많은 용량을 차지하므로 불필요한 복사를 피해야 합니다.
3. 자동 메모리 관리
Unity의 스크립팅 백엔드는 자동으로 관리되는 메모리를 할당하고 해제합니다. 이를 통해 메모리 누수를 줄일 수 있습니다.
관리되는 힙
- 힙: 오브젝트가 저장되는 메모리 공간.
- 가비지 컬렉터: 자동으로 메모리를 관리하며 개발자는 메모리를 명시적으로 할당/해제할 필요가 없음.
4. 메모리 단편화와 힙 확장
메모리 단편화는 해제된 메모리가 연속적으로 사용되지 않아 발생하는 문제입니다. 새로운 오브젝트를 할당할 때 충분한 연속적 공간이 없으면 가비지 컬렉터가 실행되거나 힙이 확장됩니다.
예시:
분류 | 설명 |
---|---|
메모리 단편화 | 사용되지 않는 메모리 공간이 분산되어 발생함 |
힙 확장 | 새로운 오브젝트를 위한 공간을 확보하기 위해 힙을 확장함 |
5. 관리되는 힙 확장의 고려 사항
힙이 확장될 때 주의할 점: - 메모리를 해제하지 않음: 시스템은 더 큰 할당이 발생할 경우를 대비함. - 빈 공간이 존재함: 운영체제에서 다시 사용하기 위해 시간차를 두고 빈 공간을 관리함.
활용 및 응용 예제
예제 1: 기본 값 타입과 레퍼런스 타입 사용
int number = 10; // 값 타입
string message = "Hello, Unity!"; // 레퍼런스 타입
예제 2: 가비지 컬렉터 이해하기
가비지 컬렉터가 어떻게 작동하는지 확인하기 위해 불필요한 객체를 생성한 후, 강제로 가비지 컬렉션을 트리거할 수 있습니다.
void CreateGarbage() {
for (int i = 0; i < 1000; i++) {
string temp = "Garbage " + i;
}
System.GC.Collect(); // 가비지 컬렉터 호출
}
이 문서는 Unity의 메모리 관리 시스템에 대한 기초적인 이해를 돕고, 실제 개발에서의 메모리 관리 방법을 제시합니다. Unity에서 메모리를 효과적으로 활용하기 위해 이 자료를 참고하시기 바랍니다.