가비지 컬렉션은 동적으로 할당되어 있는 메모리 영역 중 사용하지 않는 메모리 영역을 해제해 주는 작업을 말합니다.
가비지 컬렉션이라는 용어를 그대로 해석하면 쓰레기 수집이라는 의미가 되는데, 여기서 말하는 쓰레기란 메모리 상의 쓰레기를 말합니다. 즉, 가비지 컬렉션은 메모리상의 쓰레기를 처리해 주는 작업을 말합니다.
실무에서 프로그램을 개발할 경우 소프트웨어의 안정성은 매우 중요한 부분입니다. 안정적인 프로그램을 개발하는 데에 있어서 메모리 관리는 특히 필수입니다.
메모리를 제대로 고려하지 않고 개발하면 프로그램에 예상치 못한 문제가 생길 수 ㅣ있습니다. 가비지 컬렉션은 자도응로 메모리 관리를 해 주는 작업으로, 실무에서 메모리 영역을 다룰 경우 접하게 됩니다.
일부 오래된 언어의 경우, 사용하지 않는 메모리 공간을 해제하기 위해 개발자가 직접 메모리를 해제하는 코드를 작성해야만 했습니다. 대표적인 예로 C언어가 존재합니다.
C언어의 경우 malloc() 메소드를 이용해 힙에 동적으로 메모리를 할당해주고, free() 메소드를 이용해 할당했던 메모리를 해제함으로써 개발자가 메모리를 직접 관리했습니다.
하지만 개발자가 일일이 메모리를 관리하는 것은 어려운 일이었습니다. 메모리 상에서 발생할 수 있는 모든 문제점을 고려하고 처리하기란 쉽지 않기 때문입니다. 뿐만 아아니라 메모리 관련 버그가 발생했을 경우 버그의 원인을 추적하는 데에도 많은 비용이 들었습니다. 이런 문제점을 해결하고자 프로그래밍 언어 차원에서 메모리를 관리해 주는 가비지 컬렉션이 등장하게 됩니다.
가비지 컬렉션은 프로그램에서 사용하지 않는 메모리 공간을 찾아내 해당 메모리를 해제해 주는 작업입니다. 가비지 컬렉션은 특정 조건을 만족할 경우 동작합니다. 이 조건은 언어마다 다르기 때문에 가비지 컬렉션이 동작하는 시점 또한 언어마다 다릅니다.
가비지 컬렉션 기능을 제공하는 언어들은 자바와 자바스크립트, C# 등이 있습니다. 이렇게 언어에 가비지 컬렉션 기능이 내장되어 있는 언어가 있는 반면 가비지 컬렉션 기능을 제공하지 않아 라이브러리 등을 통해 가비지 컬렉션을 사용하는 언어도 존재합니다.
가비지 컬렉션을 사용하면 개발자가 일일이 메모리를 관리할 필요가 없기 때문에 개발자가 개발 자체에 더 집중하는 것이 가능합니다. 또한 가비지 컬렉션은 프로그램의 안정성을 높여 줍니다. 그 대표적인 예로 가비지 컬렉션을 사용하면 메모리 누수 현상을 어느 정도 예방이 가능합니다.
메모리 누수란 프로그램이 사용하지 않는 메모리 공간을 점유하고 있어 메모리 공간이 낭비되는 현상을 말합니다. 메모리 누수가 생기면 프로그램에 예상치 못한 문제가 발생할 수 있기 때문에 기존에는 개발자들이 메모리 누수를 잡아 내기 위해 굉장히 많은 시간을 사용했습니다. 하지만 가비지 컬렉션이 사용되고 있지 않는 메모리를 해제해 줌으로써 메모리 누수를 막을 수 있습니다.
가비지 컬렉션의 또 다른 장점은 바로 댕글링 포인터로 인해 발생하는 프로그램 오류를 막아 준다는 것입니다. 특정 메모리가 해제되었을 경우 포인터가 여전히 그 메모리를 가리키고 있다면 프로그램에 예상치 못한 버그가 발생할 수 있습니다. 해당 메모리 영역에 새로운 값이 할당되어 있다면 예상치 못한 값을 읽게 될 것이고, 값이 할당되지 않았다면 유효하지 않는 메모리를 참조하는 문제가 발생합니다. 가비지 컬렉션을 사용하면 이러한 문제 역시 막을 수 있습니다. 또한 가비지 컬렉션을 통해 메모리가 이중으로 해제되는 문제를 막을 수 있습니다.
가비지 컬렉션을 적용해도 메모리 누수를 완전히 잡아 내지는 못한다는 단점이 존재합니다. 또한 가비지 컬렉션은 성능 측면에서 몇 가지 문제점이 발생할 수 있습니다. 프로그램 내에게 가비지 컬렉션이 동작하는 시점과 동작에 소요되는 시간을 정확히 알 수 없기 때문에 예상치 못한 시점에서 프로그램이 정지되는 문제가 발생할 수 있습니다. 이는 실시간으로 동작하는 프로그램에서 큰 문제로 이어질 수 있습니다.
뿐만 아니라, 특정 메모리가 해제되는 시점을 정확하게 알 수 없다는 단점, 해제할 메모리를 결정하는 과정에서 이미 사용 여부를 알고 있는 메모리까지 전부 감시하기 때문에 비효율적이라는 단점 역시 존재합니다.