가비지 컬렉션(Garbage Collection)
가비지 컬렉션이란 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 자동으로 해제하는 기능입니다.
가비지(gabage)는 유효하지 않은 메모리 주소, 해제되지 않은 메모리 영역을 의미하는데 메모리가 부족할 때마다 쓰레기인 가비지를 정리해주는 기능이라고 생각하면 됩니다.
그리고 시스템에서 가비지 컬렉션 작업을 수행하는 부분을 가비지 컬렉터(garbage collector)라고 부릅니다.
C, C++ 언어에는 별도의 가비지 컬렉터가 없습니다.
즉, 프로그래머가 메모리를 할당하여 사용한 후에 직접 수동으로 동적 메모리를 해제해주어야만 했습니다.
만약에 다 쓴 메모리를 해제하지 않고 프로그램을 종료하게 되면 메모리 누수가 발생하게 되어 메모리가 낭비됩니다.
이렇게 되다 보니 로직 작성보다 메모리 관리에 더 많은 시간과 노력을 소모하는 경우가 많아 생산성이 떨어지게 되는 경우가 발생했습니다.
하지만 java 등의 언어에는 가비지 컬렉터가 존재합니다.
프로그래머가 선언된 변수를 별도로 해제하지 않아도 내장된 가비지 컬렉터가 적절한 타이밍에 자동으로 가비지를 처리합니다.
가비지 컬렉션 장점
가비지 컬렉션이 지원되는 환경에서는 프로그래머가 동적으로 할당한 메모리 영역을 신경쓰고 관리할 필요가 없습니다.
그리고 다음과 같은 버그를 막을 수 있습니다.
1. 유효하지 않은 포인터 접근: 이미 해제된 메모리에 접근하는 버그
2. 이중 해제: 이미 해제된 메모리는 또다시 해제하는 버그
3. 메모리 누수: 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그
가비지 컬렉션 단점
어떤 메모리를 해제할지 결정하는 데 비용이 듭니다.
가비지 컬렉션이 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵습니다.
할당된 메모리가 해제되는 시점을 알 수 어렵습니다.
매니지드 언어 vs 언매니지드 언어
가비지 컬렉션 기능을 가진 언어를 매니지드 언어(managed language), 없는 언어를 언매니지드(unmanaged language)라고 부릅니다.
즉, 메모리 관리를 자동으로 하느냐, 수동으로 하느냐에 따라서 나누어지게 됩니다.
대표적인 언매니지드 언어는 위에 언급했던 C, C++이 있습니다.
메모리 할당과 해제를 직접 관리하고 메모리 누수가 생기지 않게 신경써야 하지만 매니지드 언어에 비해 속도가 빠르다는 장점이 있습니다.
그리고 프로그래머가 컴퓨터 하드웨어를 직접 제어할 수 있기 때문에 프로그래밍의 자유도가 높아집니다.
한편 매니지드 언어는 java, python, javascript, C#, PHP 등이 있습니다.
언어 자체적으로 메모리를 관리(가비지 컬렉터)하기 때문에 따로 신경쓸 필요가 없습니다.
하지만 컴퓨터 하드웨어를 직접 제어 할 수 없기 때문에 프로그래밍의 자유도가 낮으며 메모리 정리가 언제 이루어지는지 알기 힘듭니다.
Reference