모의 면접을 진행하면서 메모리 파편화에 대해 알게 되었다.
메모리 파편화(memory fragmentation)는 프로그램이 메모리를 할당하고 해제하는 과정에서 사용 가능한 메모리가 작은 조각들로 나뉘는 현상을 말한다.
이는 메모리 사용의 효율성을 떨어뜨리고, 프로그램의 성능을 저하시킬 수 있다.
C#과 같은 관리되는 언어에서는 자동 메모리 관리가 이루어지긴 하지만, 파편화는 여전히 발생할 수 있다.
할당된 메모리 블록 사이에 사용 가능한 메모리가 충분히 있지만, 연속적이지 않아서 큰 메모리 블록을 필요로 하는 요청을 충족시키지 못하는 상황을 말한다.
즉, 메모리는 있지만 사용 가능한 공간이 작은 블록들로 나뉘어져 있어서 낭비되는 것이다.
할당된 메모리 블록 내에 사용되지 않는 공간이 생기는 것을 말한다.
예를 들어, 어떤 객체에 할당된 메모리 공간이 실제로 필요한 것보다 크면 그 차이만큼의 메모리가 낭비된다.
C#에서는 가비지 컬렉터(Garbage Collector, GC)가 메모리 관리를 자동화하여 개발자가 직접 메모리를 해제하지 않도록 돕는다,
GC는 애플리케이션의 메모리 사용을 추적하고, 더 이상 사용되지 않는 객체를 정리하는 작업을 한다.
그 과정에서 GC는 메모리를 정리하고 조각 모음(compaction)을 수행하여 힙 파편화를 줄일 수 있다.
C#에서는 스택 메모리가 주로 메서드 호출과 로컬 변수 저장에 사용된다.
스택 메모리는 선입후출(LIFO) 방식으로 관리되며, 메서드 호출 시 생성된 프레임이 메서드가 반환되면 제거된다.
따라서, 스택 메모리 파편화는 관리되는 환경에서는 드물지만, 잘못된 설계로 인해 매우 큰 스택 프레임이 반복적으로 생성되어 스택 오버플로우를 유발할 수 있다.
객체 풀링(Object Pooling): 사용 빈도가 높은 객체를 미리 생성해 놓고, 필요할 때마다 재사용함으로써 메모리 할당 및 해제를 줄일 수 있다.
대형 객체 사용 최소화: .NET에서 대형 객체는 별도의 대형 객체 힙(Large Object Heap, LOH)에 저장된다. LOH는 GC에 의해 적게 정리되기 때문에, 대형 객체를 불필요하게 많이 사용하면 파편화를 유발할 수 있다.
전체적인 디자인 하기.