프로그래밍에서 메모리 관리는 요리사와 보조의 역할로 비유할 수 있습니다.
조리대(= 메모리)는 요리사가 요리를 준비하는 공간입니다. 이 공간은 한정적이기 때문에, 요리를 하다 보면 식재료나 도마 같은 도구를 올려놓게 되고, 사용이 끝난 도구는 치워야 합니다. 하지만 요리사는 레시피만 따라가기 때문에, 도마가 필요 없어도 스스로 치우지 못합니다.
이때 등장하는 게 바로 보조입니다. 보조는 레시피를 보고 더 이상 필요 없는 도구를 알아서 치워줍니다. 프로그래밍에서 이 보조의 역할을 하는 것이 바로 가비지 컬렉터(Garbage Collector)입니다.
컴퓨터가 작업을 수행할 때는 메모리(RAM)라는 조리대가 필요합니다. 조리대가 넓으면 한 번에 더 많은 작업을 처리할 수 있죠. 프로그래머는 코드를 작성하면서 변수, 함수, 객체 등을 생성합니다. 이들은 메모리를 차지하며, 작업이 끝난 뒤에는 필요 없는 데이터가 됩니다.
만약 필요 없는 데이터를 치우지 않으면 메모리가 점점 꽉 차게 되고, 결국 컴퓨터가 멈추거나 오류가 발생합니다. 이 상태를 메모리 누수(Memory Leak)라고 합니다.
모든 프로그래머가 항상 메모리 관리를 철저히 할 수는 없으므로, 자바와 같은 Managed Language에서는 가비지 컬렉터가 이를 자동으로 처리합니다.
가비지 컬렉터는 다양한 방식으로 메모리를 관리합니다. 대표적인 두 가지는 다음과 같습니다.
Mark-and-Sweep
조리대 전체를 훑으며 필요한 데이터에만 표시(Mark)한 뒤, 표시되지 않은 데이터를 제거합니다.
프로그램 관점에서는 Root에 연결되지 않은 객체들을 제거하는 방식입니다.
Reference Counting
객체가 몇 번 참조되고 있는지 확인합니다.
참조 횟수가 0이 되면 해당 객체를 메모리에서 제거합니다.
초기 가비지 컬렉터는 작업 중인 프로그램을 멈추고 조리대를 전수조사한 뒤 불필요한 데이터를 치웠습니다. 이 과정에서 컴퓨터가 몇 초간 멈추기도 했습니다. 하지만 현대의 가비지 컬렉터는 멀티 스레드를 활용해 프로그램을 방해하지 않고 작업을 수행하도록 발전했습니다.
가비지 컬렉터가 완벽하지는 않습니다. 사람처럼 판단력이 없기 때문에 모든 불필요한 데이터를 100% 제거하지 못할 수 있습니다. 따라서 프로그래머는 메모리 관리에 대해 신경 써야 합니다.
순환 참조를 피하세요.
두 객체가 서로 참조하면 참조 카운트가 0이 되지 않아 메모리에서 제거되지 않습니다. 이는 파산 상태에서 돌려막는 것과 같습니다.
언어와 환경에 맞는 메모리 관리 방식 학습
언어와 환경에 맞는 메모리 관리 방식 학습
사용하는 언어와 플랫폼에 따라 메모리 관리 방법이 다릅니다.
어떤 환경에서는 효과적인 방법이 다른 환경에서는 성능을 저하시킬 수도 있습니다.
메모리 누수는 완벽하게 방지할 수 없지만, 디버깅과 모니터링 툴을 활용하면 찾아낼 수 있습니다.
언어나 환경별로 제공되는 도구를 잘 활용해 누수를 확인하고 해결하는 것이 중요합니다.
가비지 컬렉터는 메모리 관리를 자동화하여 프로그래밍을 편리하게 만들어줍니다. 하지만 이를 맹신하지 말고, 언어와 환경에 맞는 메모리 관리 방법을 익히고, 디버깅 툴을 활용해 누수를 방지하는 노력을 기울여야 합니다.
좋은 프로그래머는 메모리 관리까지 신경 쓰는 프로그래머입니다.