프로그램을 개발 하다 보면 유효하지 않은 메모리인 가비지(Garbage)가 발생하게 됩니다. C나 C++을 이용하다보면 동적으로 할당한 메모리가 대표적으로 가비지입니다. 두 언어에서는 개발자가 직접 free()나 delete()함수로 할당해제를 해야 메모리누수가 일어나지 않게 됩니다. 하지만 C#에서는 가비지 콜렉터(Garbage Collector)가 사용하지 않는 불필요한 메모리를 자동으로 할당 해제하게 됩니다. 이 것을 가비지 콜렉션(Garbage Collection)이라고 합니다.
메모리를 한 번에 크게 할당받은 후 프로그램 실행도중에 메모리가 필요해지면 미리 할당한 곳에서 넘겨받아 사용하는 방식입니다. 객체를 생성/삭제할 때는 힙에서 메모리를 할당/해제해야 하는데 시간이 많이 걸리므로 하나의 큰 버퍼를 할당한 후 내부적으로 따로 관리하여 사용하는 것이 실시간 성능 향상에 도움이 됩니다. 또 메모리 단편화 문제를 막는데도 도움이 됩니다.
메모리 단편화란 RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태를 보고 메모리 단편화가 발생했다고 합니다.
메모리 단편화는 내부 단편화와 외부 단편화로 구분 가능하다.
메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황입니다.
예를 들어 메모장을 켰는데 OS가 4kb를 할당해줬다고 합니다. 그런데 사실상 1kb만큼만 사용하고 있을 때 필요 이상으로 프로세스가 메모리를 할당받았으므로 내부 단편화가 3kb만큼 생긴 것입니다.
메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 됩니다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황입니다.
예를 들어 메모리 처음 주소에 8mb짜리 프로세스가 할당되었고 바로 이어서 16mb짜리 프로세스가 할당되었다고 가정했을 때 8mb짜리 프로세스를 종료시키면 메모리 처음 주소부터 8mb만큼 공간이 생깁니다. 이런 식으로 계속해서 빈 메모리가 쌓이는데 빈 메모리의 공간중에 제일 큰 빈 메모리가 8mb라고 한다면 9mb짜리 프로세스를 할당을 해야할 때 마땅한 공간은 없지만 전체적으로 메모리 여유는 있을 때 외부단편화가 생겼다고 합니다.
게임 개발에서 오브젝트 풀링은 자주 사용되는 디자인 패턴입니다. 오브젝트를 생성하는 데에는 메모리 사용 등 리소스를 사용하는 부분이 많은데, 이러한 부분을 최소화 하여 생성을 최대한 적게 하고 재활용 하는 디자인 패턴입니다. 즉, 오브젝트를 미리 많이 생성해 놓고 재활용하는 방식입니다. 이 때 생성하고 삭제하는 작업이 필요하지 않기 때문에 메모리를 여기저기 사용하는 것이 아닌 정해진 공간을 계속 사용하는 장점이 있습니다. 단점은 얼마나 사용할지 애매할 때 사용하는 것보다 더 많이 메모리를 잡을 수도 있다는 것입니다. 따라서 사용할 적절한 양만큼만 만들어 놓는 것이 좋습니다.