가비지 컬렉션
- 메모리 관리를 위해 사용되는 프로세스
- 프로그램이 실행 중인 동안 사용되지 않는 메모리 자원을 자동으로 식별하고 회수하는 것을 목표로 한다.
- 이를 통해 프로그래머는 메모리 할당 및 해제에 대한 관리에 신경 쓸 필요 없이 프로그램 개발에 집중할 수 있다.
원리?
Reachability(도달 가능성)
- 루트(root) 객체에서 시작하여 메모리 내의 모든 객체에 대한 접근 가능성을 확인한다.
- 이러한 루트는 전역 변수, 스택 프레임 내의 변수 등이 될 수 있다.
Mark and Sweep(표시 및 정리)
- 접근 가능한 모든 객체가 표시된다.
- 그런 다음, 표시되지 않은 객체는 메모리에서 제거된다.
- 이러한 프로세스는 일반적으로 "Mark and Sweep" 알고리즘을 사용하여 수행된다.
Compact(압축)
- 일부 가비지 컬렉터는 메모리를 정리할 때 공간을 압축하여 연속적인 공간을 유지하는 작업을 수행한다.
- 이는 메모리 단편화를 줄이고 프로그램의 성능을 향상시킨다.
연관 개념?
참조 계수(Reference Counting)
- 객체가 참조될 때마다 해당 객체의 참조 횟수를 증가시키고, 참조가 제거될 때마다 감소시키는 방법
- 참조 횟수가 0이 되면 해당 객체는 가비지 컬렉션의 대상이 된다.
- 그러나 순환 참조 등의 문제로 인해 가비지 컬렉션의 효율성이 떨어질 수 있다.
메모리 누수(Memory Leaks)
- 가비지 컬렉션을 사용하더라도 프로그램이 메모리를 올바르게 관리하지 않으면 메모리 누수가 발생할 수 있다.
- 메모리 누수는 프로그램이 더 이상 필요하지 않은 메모리 자원을 계속 보유하고 있는 상태를 의미한다.
Finalization(파이널라이제이션)
- 몇몇 언어에서는 객체가 가비지 컬렉션의 대상이 되기 전에 최종 처리(finalization)를 수행할 수 있다.
- 이를 통해 객체가 소멸되기 전에 필요한 정리 작업을 수행할 수 있다.
Stop-the-world 이벤트
- 일부 가비지 컬렉션 알고리즘은 메모리 정리를 위해 프로그램 실행을 일시 중지하는 "stop-the-world" 이벤트를 발생시킨다.
- 이는 프로그램의 성능에 영향을 줄 수 있으므로 주의해야 한다.
가비지 컬렉션의 예시는 다양한 프로그래밍 언어에서 찾을 수 있다.
예를 들어, Java, C#, Python 등의 언어에서는 가비지 컬렉터가 내부적으로 동작하여 메모리 관리를 수행한다.
이를 통해 프로그래머는 명시적으로 메모리를 해제할 필요가 없다.
// Java에서의 가비지 컬렉션 예시
class MyClass {
public void myMethod() {
// 메모리 할당
Object obj = new Object();
// obj를 사용한 후, 더 이상 필요하지 않음
obj = null; // 가비지 컬렉션의 대상이 됨
}
}
- obj가 더 이상 필요하지 않은 시점에서 명시적으로 null로 설정하여 가비지 컬렉션의 대상이 되도록 한다.
- 이후 가비지 컬렉터가 해당 객체를 인식하고 메모리에서 해제할 수 있다.
가비지 컬렉션에 대한 추가적인 고려사항?
1. 성능 영향
- 프로그램의 성능에 영향을 미칠 수 있다.
- 특히, 대규모 객체가 빈번하게 생성되거나 메모리 사용량이 많은 경우에는 가비지 컬렉션에 의한 일시 중지(stop-the-world)가 더 자주 발생할 수 있다.
- 이러한 상황에서는 가비지 컬렉션 알고리즘의 선택과 메모리 사용 패턴의 최적화가 중요하다.
2. 메모리 관리 최적화
- 가비지 컬렉션을 최적화하려면, 메모리 사용 패턴을 이해하고 객체의 생명 주기를 고려해야 한다.
- 예를 들어, 임시 객체를 빈번하게 생성하는 작업이 있는 경우에는 재사용이 가능한 객체를 사용하거나 메모리 풀(memory pool)을 구현하여 가비지 컬렉션의 부담을 줄일 수 있다.
3. 언어별 차이점
- 가비지 컬렉션은 프로그래밍 언어에 따라 구현 방식과 동작 방식이 다를 수 있다.
- ex. Java의 가비지 컬렉션은 HotSpot VM에서 사용하는 G1(Garbage-First) 컬렉터와 같은 다양한 알고리즘이 있으며, 각각의 장단점이 있다.
- 따라서 특정 언어의 가비지 컬렉션에 대한 이해와 그 언어의 메모리 모델에 대한 이해가 필요하다.