# 오버헤드와 가비지 컬렉션
🗑️ 가비지 컬렉션과 오버헤드
프로그래밍을 하면서 "메모리 관리"라는 단어를 자주 듣게 된다. 특히 Java 같은 언어를 사용할 때, 가비지 컬렉션(Garbage Collection, GC) 이 자동으로 메모리를 관리해준다는 얘기를 듣고 "그럼 우리는 신경 쓸 필요 없겠네?"라고 생각할 수도 있다. 하지만 정말 그럴까? 🤔
🧹 가비지 컬렉션이란?
가비지 컬렉션은 프로그램이 동적으로 할당한 메모리 중 더 이상 사용되지 않는 메모리를 자동으로 해제하는 과정이다. 덕분에 개발자가 직접 free()
같은 함수를 호출할 필요가 없고, 메모리 누수(memory leak) 문제를 줄일 수 있다.
하지만 가비지 컬렉션이 언제, 어떻게 동작하는지는 생각보다 복잡하다. 예를 들어, Java의 GC는 Mark and Sweep 알고리즘을 사용한다. GC는 먼저 "사용 중인 객체(mark)"와 "사용되지 않는 객체"를 구분한 후, 사용되지 않는 객체를 정리(sweep)하는 방식으로 동작한다.
그렇다면 여기서 한 가지 의문이 든다. 🤨
"GC가 메모리를 해제하는 동안 애플리케이션의 성능에는 영향을 주지 않을까?"
이 질문이 바로 GC 오버헤드(GC Overhead) 라는 개념으로 이어진다.
⚡ 오버헤드란?
오버헤드(Overhead) 는 특정 작업을 수행하기 위해 추가적으로 드는 비용이다. 예를 들어, 우리가 코드를 실행하는 데 10초가 걸리는데, 성능을 최적화하는 코드가 추가되어 15초가 걸린다면, 오버헤드는 5초가 된다.
GC도 마찬가지다. GC가 실행될 때 애플리케이션이 잠시 멈추는 Stop-the-World (STW) 이벤트가 발생할 수 있다. 즉, GC가 실행되는 동안 다른 작업을 하지 못하는 것이다.
이제 질문이 하나 더 생긴다. 🤔
"그럼 가비지 컬렉션 오버헤드를 줄이려면 어떻게 해야 할까?"
🎯 결론
가비지 컬렉션은 개발자가 직접 메모리를 관리하지 않아도 되게 해주는 강력한 기능이다. 하지만 성능을 최적화하려면 GC의 원리를 이해하고, 오버헤드를 최소화하는 방법을 고민해야 한다. GC 알고리즘 선택, 힙 크기 조정, 객체 할당 최소화 등을 고려하면 보다 최적화된 애플리케이션을 만들 수 있다.