- 순서
- 메모리 단편화란?
- 메모리 단편화의 종류
- 메모리 단편화가 생기는 원인
- 메모리 단편화의 측정과 영향
- 메모리 단편화를 해결하기 위한 방법
- 정리
- 메모리 단편화란?
- 메모리 할당.해제 과정에서 사용 가능한 메모리 블록이 조각나서 요구하는 메모리의 크기의 연속된 공간을 확보하기 어려운 현상.
- 메모리 단편화의 종류
- 내부 단편화(Internal fragmentation)
- 메모리 정렬이나 최소 블록 단위 때문에 실제 필요한 크기보다 더 많이 할당되는 현상
- 예를 들어 3바이트가 필요해도 8바이트 단위로 맞춰서 할당되는 것
- 외부 단편화(External fragmentation)
- 동적 메모리 할당과 해제가 반복되면서 힙 메모리가 잘게 조각나 큰 연속적인 공간을 할당하기 어려워지는 문제
- 작은 객체를 반복적으로 생성/삭제하다가 큰 객체를 생성하려고 하면 실패하는 현
- 내부 단편화(Internal fragmentation)
- 메모리 단편화가 생기는 원인
- 다양한 크기의 할당/해제가 반복되어 자유 블록이 흩어짐.
- 할당 단위로 인한 내부 낭비
- 여러 스레드/아레나로 이한 분산된 프리 리스트
- 메타데이터(overhead)를 각 블록에 붙이는 방식
- 큰 객체와 작은 객체가 섞여 힙에 작은 구멍들이 많이 생김
- 메모리 단편화의 측정과 영향
- 측정
- C++
- 메모리 프로파일링 도구 사용
- 메모리 사용량 통계 출력
- malloc_info()같은 OS레벨 API로 heap 상태를 확인
- 언리얼
- 자체 메모리 시스템인 FMemory, FMalloc, MemoryProfiler를 통해 단편화 모니터링을 지원함
- Stat Memory 콘솔 명령어 => 할당된 메모리, 누수, 힙 상태 표시
- MemReport => 특정 시점 메모리 사용량 리포트
- Memory Insights => 메모리 단편화 및 할당 패턴을 분석함
- C++
- 영향
- C++에서 메모리 단편화의 영향
- 내부 단편화는 메모리가 낭비됨
- 외부 단편화로는 큰 배열/버퍼 할당 시 실패 가능성이 있음.
- UE에서 메모리 단편화의 영향
- Actor/UObjeect 기반 메모리는 Unreal GC가 관리하여 단편화 직접 영향은 제한적임
- 버퍼/렌더링 리소스/네트워크 패킷 등의 Non-UObject 메모리에서는 외부 단편화 문제가 성능/안정성에 직격함
- 할당 실패로 인한 Crash 또는 Streaming hitch가 발생할 수 있음
- C++에서 메모리 단편화의 영향
- 측정
- 메모리 단편화를 해결하기 위한 방법
- C++
- 메모리 풀/오브젝트 풀
- 미리 큰 메모리 블록을 할당해두고 필요할 때 나눠 쓰는 방식임
- C++17 이후 std::pmr::memory_resource와 같은 커스텀 allocator 사용 가능
- 게임 루프에서 자주 생성/삭제되는 객체에 유용함
- 커스텀 Allocator
- STL컨테이너에 맞춤형 allocator를 제공해 단편화를 줄임
- 연속된 메모리 덩어리를 쓰도록 해서 캐시 효율도 높임
- 메모리 풀/오브젝트 풀
- 언리얼 엔진
- GC
- UObject는 UE의 GC시스템이 관리함 => 엔진이 객체 메모리를 풀링/압축해서 외부 단편화를 줄여줌
- GC에 의존하면 타이밍 제어가 어렵기 때문에, 자주 생성되는 건 UObject보다 Non-UObject 구조체나 풀링 기법을 활용하는 게 나음.
- FMemory/Fmalloc 커스텀 할당자
- UE는 자체 메모리 관리 레이어 FMemory::Malloc, FMemory::Free를 제공함 => 주로 UObject 이외 버퍼, 풀링, 고성능 메모리를 관리함
- 플랫폼별 최적화된 malloc/free를 사용하며, 필요하다면 커스텀 할당자인 FMalloc을 구현해 단편화 문제를 완화 가능함
- 오브젝트 풀
- 탄환, 파편 UI 위젯 같은 반복적으로 생성/삭제되는 Actor는 풀링 시스템을 구현해 재사용하는 방법
- 메모리 정렬
- UE는 SIMD 최적화를 위해 16바이트/32바이트 정렬을 많이 사용함
- alignas(16)또는 UE 매크로인 DECLARE_ALIGN으로 내부 단편화를 줄이고 캐시 효율도 올릴 수 있음.
- GC
- C++
- 정리
- C++에서 외부 단편화는 ObjectPool, Cutom Allocator로 해결하고, 내부 단편화는 정렬과 블록 단위 관리로 완화
- 언리얼에서 GC와 자체 메모리 관리 시스템이 있지만, 실시간 성능을 위해서 Object Pool과 FMemory 활용을 통해 개선함.
'CS' 카테고리의 다른 글
| [CS] 캐시의 지역성 (0) | 2025.08.28 |
|---|---|
| [CS] 프로세스와 스레드 (2) | 2025.08.28 |
| [CS]프로세스의 메모리 (1) | 2025.08.27 |
| [CS]빌드 프로세스 (0) | 2025.08.27 |
| [CS] CPU와 GPU (4) | 2025.08.26 |