반응형
가비지 컬렉션(Garbage Collection)이란?
가비지 컬렉션(Garbage Collection)은 자바의 중요한 기능 중 하나로, 더 이상 사용되지 않는 메모리를 자동으로 회수하여 메모리 관리를 지원합니다. 여기서는 가비지 컬렉션의 기본 개념과 사용하는 알고리즘에 대해 설명하겠습니다.
가비지 컬렉션 기본 개념
자바의 가비지 컬렉션은 다음 원칙에 따라 동작합니다:
- 객체 추적: 가비지 컬렉터는 각 객체가 참조되고 있는지 추적합니다. 메모리에 존재하는 객체 중에서 사용되지 않는 객체를 식별합니다.
- 자동 회수: 사용되지 않는 객체(즉, 더 이상 참조되지 않는 객체)는 가비지 컬렉터에 의해 자동으로 회수됩니다. 이는 프로그래머가 직접 메모리를 해제하지 않아도 되는 장점을 제공합니다.
가비지 컬렉션 알고리즘
가비지 컬렉션을 위해 여러 가지 알고리즘이 사용될 수 있으며, 주요 알고리즘에는 다음과 같은 것들이 있습니다:
- Mark-and-Sweep (표시-삭제):
- 이 알고리즘은 가장 기본적인 형태의 가비지 컬렉션 알고리즘으로, 다음 단계로 구성됩니다:
- 표시(Mark): 루트(root) 객체에서 시작하여 참조 가능한(reachable) 모든 객체를 표시합니다.
- 삭제(Sweep): 표시되지 않은(unmarked) 객체들을 삭제합니다.
- 단점은 메모리 조각화가 발생할 수 있고, 전체 멈춤(stop-the-world)이 발생할 수 있습니다.
- 이 알고리즘은 가장 기본적인 형태의 가비지 컬렉션 알고리즘으로, 다음 단계로 구성됩니다:
- Copying (복사):
- 이 알고리즘은 힙을 두 영역(예를 들어, Eden 영역과 Survivor 영역)으로 나누고, 객체를 한 영역에서 다른 영역으로 복사합니다.
- 사용되지 않는 객체는 제거됩니다.
- 이 알고리즘은 Mark-and-Sweep 보다 메모리 조각화 문제가 적고, GC 시간이 짧지만, 전체 객체를 복사해야 하므로 비용이 더 크다는 단점이 있습니다.
- Generational (세대별):
- 이 알고리즘은 객체의 생존률에 따라 힙을 여러 세대(generation)로 분류하고 관리합니다.
- 대부분의 객체는 짧은 기간 동안만 사용되므로, 더 적은 비용으로 가비지 컬렉션을 수행할 수 있습니다.
- Young Generation과 Old Generation으로 나뉘며, Young Generation에서는 더 빈번한 가비지 컬렉션을 수행하고, Old Generation에서는 드물게 가비지 컬렉션을 수행합니다.
예시
아래는 간단한 객체 생성 및 가비지 컬렉션의 예시입니다:
public class GarbageCollectionExample {
public static void main(String[] args) {
// 객체 생성
MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();
// obj2를 null로 설정하여 더 이상 참조되지 않도록 함
obj2 = null;
// 가비지 컬렉션을 유도하기 위해 임의의 시점에서 메모리 부족 상황을 유발
// System.gc(); // 명시적으로 가비지 컬렉션을 호출할 수 있지만, 권장되지 않음
// 자바의 가비지 컬렉터는 자동으로 obj2가 참조하는 객체를 회수할 수 있음
}
}
가비지 컬렉션은 누가 선택하는가?
가비지 컬렉션 알고리즘은 주로 JVM(Java Virtual Machine)이 선택합니다. JVM은 여러 가지 가비지 컬렉션 알고리즘을 내부적으로 구현하고, 실행 중인 환경 및 상황에 따라 적절한 알고리즘을 선택합니다. 이 선택은 일반적으로 다음과 같은 요소들을 고려하여 이루어집니다:
- 성능 요구 사항: 시스템의 응답 시간, 처리량 등의 성능 요구 사항에 따라 가비지 컬렉션 알고리즘을 선택합니다. 예를 들어, 실시간 시스템에서는 일시 중지(stop-the-world)가 발생하지 않는 알고리즘을 선호할 수 있습니다.
- 메모리 사용 패턴: 애플리케이션의 메모리 사용 패턴에 따라 알고리즘을 선택합니다. 예를 들어, 대부분의 객체가 짧은 시간 동안만 살아 있고 일시적인 메모리 요구가 높은 경우에는 Generational 가비지 컬렉션 알고리즘이 효율적일 수 있습니다.
- 하드웨어 및 운영 체제: 가비지 컬렉션 알고리즘의 선택은 하드웨어의 성능 특성 및 운영 체제의 특성에 따라 달라질 수 있습니다. 예를 들어, 멀티코어 프로세서 환경에서 병렬 가비지 컬렉션 알고리즘이 성능 향상을 가져올 수 있습니다.
- JVM의 구현: JVM 제공 업체(예: Oracle JDK, OpenJDK, IBM JDK 등)에 따라 가비지 컬렉션 알고리즘의 구현 및 선택 방식이 다를 수 있습니다.
따라서 개발자는 일반적으로 JVM이 선택하는 기본 가비지 컬렉션 알고리즘에 의존하며, 특별한 경우에는 JVM 설정을 통해 알고리즘을 변경하거나 튜닝할 수 있습니다. 하지만 대부분의 상황에서는 JVM이 알아서 적절한 알고리즘을 선택하므로 개발자가 직접 선택할 필요는 없습니다.
결론
자바의 가비지 컬렉션은 메모리 관리를 자동화하여 개발자가 메모리 관리에 직접 신경 쓸 필요를 줄입니다. 이는 자바의 장점 중 하나이며, 알맞은 가비지 컬렉션 알고리즘 선택과 세부적인 튜닝이 중요합니다.
반응형
'Programming > Java, Kotlin' 카테고리의 다른 글
[Java] 커스텀 불변 클래스란? Immutable Class 특징, 예, 이점 (0) | 2024.06.22 |
---|---|
[Java] ThreadPoolExecutor란? 주요 기능, 사용예시, 장점, 동작 방식 (0) | 2024.06.22 |
[Java] JVM 이란? 자바 메모리(메모리 각 영역에 객체, 메소드 및 변수를 저장하는 법) (0) | 2024.06.22 |
[Java] 멀티스레드, 스레드풀이란? 사용예시, 장단점, 차이점 (0) | 2024.06.22 |
[Java] Exception 예외처리란? 예외처리 종류, 예시, 장단점 (0) | 2024.06.22 |