🐧 들어가기 앞서

모의 면접을 진행하면서 메모리 파편화에 대해 알게 되었다.


🐧 오늘 배운 것

메모리 파편화(memory fragmentation)는 프로그램이 메모리를 할당하고 해제하는 과정에서 사용 가능한 메모리가 작은 조각들로 나뉘는 현상을 말한다.

이는 메모리 사용의 효율성을 떨어뜨리고, 프로그램의 성능을 저하시킬 수 있다.

C#과 같은 관리되는 언어에서는 자동 메모리 관리가 이루어지긴 하지만, 파편화는 여전히 발생할 수 있다.


🐧 기억할 것 & 진행

힙 파편화(Heap Fragmentation)

  • 외부 파편화(External Fragmentation)

할당된 메모리 블록 사이에 사용 가능한 메모리가 충분히 있지만, 연속적이지 않아서 큰 메모리 블록을 필요로 하는 요청을 충족시키지 못하는 상황을 말한다.

즉, 메모리는 있지만 사용 가능한 공간이 작은 블록들로 나뉘어져 있어서 낭비되는 것이다.

  • 내부 파편화(Internal Fragmentation)

할당된 메모리 블록 내에 사용되지 않는 공간이 생기는 것을 말한다.

예를 들어, 어떤 객체에 할당된 메모리 공간이 실제로 필요한 것보다 크면 그 차이만큼의 메모리가 낭비된다.

C#에서는 가비지 컬렉터(Garbage Collector, GC)가 메모리 관리를 자동화하여 개발자가 직접 메모리를 해제하지 않도록 돕는다,

GC는 애플리케이션의 메모리 사용을 추적하고, 더 이상 사용되지 않는 객체를 정리하는 작업을 한다.

그 과정에서 GC는 메모리를 정리하고 조각 모음(compaction)을 수행하여 힙 파편화를 줄일 수 있다.

스택 파편화(Stack Fragmentation)

C#에서는 스택 메모리가 주로 메서드 호출과 로컬 변수 저장에 사용된다.

스택 메모리는 선입후출(LIFO) 방식으로 관리되며, 메서드 호출 시 생성된 프레임이 메서드가 반환되면 제거된다.

따라서, 스택 메모리 파편화는 관리되는 환경에서는 드물지만, 잘못된 설계로 인해 매우 큰 스택 프레임이 반복적으로 생성되어 스택 오버플로우를 유발할 수 있다.

파편화 최소화, 해결 하는 방법

  • 객체 풀링(Object Pooling): 사용 빈도가 높은 객체를 미리 생성해 놓고, 필요할 때마다 재사용함으로써 메모리 할당 및 해제를 줄일 수 있다.

  • 대형 객체 사용 최소화: .NET에서 대형 객체는 별도의 대형 객체 힙(Large Object Heap, LOH)에 저장된다. LOH는 GC에 의해 적게 정리되기 때문에, 대형 객체를 불필요하게 많이 사용하면 파편화를 유발할 수 있다.


🐧 내일 할 일

전체적인 디자인 하기.

0개의 댓글