-
시스템에서 더이상 사용하지 않는 동적할당된 영역(Heap)을 찾아 자동으로 회수해주는 메모리 관리 프로세스
- 메모리 누수 방지
- 메모리 자원을 효율적으로 관리
- 가비지 컬렉션 시, 성능 저하 발생
- 힙에 가비지가 많을수록 가비지 컬렉션이 더 자주 발생
- C나 C++은 힙에 할당한 객체를 직접 해제해줘야함 (안할 경우 메모리 누수 발생)
-
유니티는 Boehm-Demer-Wiser 방식의 GC를 사용
- Mark-and-Sweep 방식의 GC 알고리즘 사용
- Mark-and-Sweep : 모든 객체를 탐색 후 사용 빈도에 따라 메모리에서 해제
-
가비지 컬렉션이 모든 가비지를 잡진 못하며 가비지 컬렉션이 자주 발생할수록 성능 저하 발생
- 프로그래머도 힙 관리에 신경쓸 필요가 있음
- 정확한 가비지 컬렉션 타이밍을 예측하기 힘들기 때문에 가비지 컬렉션 최적화가 필요
-
힙 파편화
- 힙에 객체를 할당, 해제를 반복하는 과정에서 빈 공간들이 발생
- 새로운 객체를 할당하고자 할 때 힙의 공간 자체는 여유가 있지만 파편화로 인해 해당 객체가 들어갈 연속된 공간이 부족해지는 현상
- GC의 메모리 컴팩션 필요

힙 파편화

메모리 컴팩션
-
가비지 컬렉션 최적화
-
오브젝트 풀링
-
문자열 연산 최소화
- +연산 사용 시, 새로운 객체 생성
- StringBuilder 클래스 사용
- $”{}” 방식 사용해도됨
-
쓸데없는 가비지 생성 최소화
-
적절한 타이밍에 강제적인 가비지 컬렉션 진행
- 씬 전환, UI 오픈, 로딩 등 성능저하가 발생해도 티가 안나는 상황에 GC를 호출
- 가비지 컬렉션을 수동으로 호출함으로써 가비지 컬렉션 주기를 늦출 수 있음
System.GC.Collect();
-
Struct와 Class
- Struct는 스택 영역에 저장
- ValueType
- 함수에 전달 시 값이 복제되어 전달됨
- Class는 힙 영역에 저장
- Reference Type
- 함수에 전달 시 값이 참조되어 전달됨
- 간단한 값 전달을 위해선 Class보단 Struct를 사용하는게 가비지를 줄이는데 도움된다.
-
점진적 가비지 컬렉션
- 가비지 컬렉션을 여러 프레임에 분산시킴
- 유니티의 가비지 컬렉션에서는 기본값
- 스파이크 현상 감소

점진적 가비지 컬렉션 설정

점진적 가비지 컬렉션 비활성

점진적 가비지 컬렉션 활성