1. 가비지 컬렉터란?
Java는 C++과 달리 명시적으로 메모리를 해제(delete)할 필요가 없다. 대신, 가비지 컬렉터(GC) 가 필요하지 않은 객체를 자동으로 정리해준다.
📌 가비지 컬렉터의 역할
- 더 이상 사용되지 않는 객체를 자동으로 제거하여 메모리 누수를 방지.
- 메모리를 효율적으로 관리하여 프로그램이 안정적으로 실행되도록 유지.
- 스택(Stack) 메모리는 직접 정리되지만, 힙(Heap) 메모리는 GC가 관리.
2. 가비지 컬렉터의 동작 순서 (프로그램 실행 단위 기준)
- 객체 생성: 프로그램 실행 중 new 키워드를 사용하여 객체를 생성함.
- 객체 참조 관리: 생성된 객체는 변수나 필드에 의해 참조됨.
- 참조 여부 검사 (Mark 단계): GC가 실행되면 각 객체가 현재 사용 중인지 확인함.
- 사용되지 않는 객체 식별 (Sweep 단계): 더 이상 참조되지 않는 객체를 찾고 삭제함.
- 메모리 단편화 정리 (Compaction 단계, 필요시 수행): 메모리 조각화를 방지하고 새로운 객체가 저장될 공간을 확보함.
- 정리 완료 후 프로그램 계속 실행: GC가 완료되면 프로그램은 정상적으로 실행을 이어감.
📌 GC 실행 과정은 C++의 컴파일 과정 (전처리기 → 컴파일러 → 어셈블러 → 링커)과 유사한 단계적 처리 방식으로 동작함.
3. GC의 주요 단계 상세 설명
📌 1. 참조 여부 검사 (Mark 단계)
- GC가 실행되면, 모든 객체를 검사하여 현재 사용 중인지 여부를 확인한다.
- 루트(root) 객체에서부터 탐색을 시작하여, 직접적으로 또는 간접적으로 참조되는 객체를 "사용 중"으로 표시한다.
- 루트 객체란?
- 스택(Stack) 변수 (예: main() 메서드 내의 지역 변수)
- 정적(static) 변수
- 활성화된 쓰레드에서 참조하는 객체
- 루트 객체란?
- 사용 중인 객체는 "Mark(표시)"되며, 사용되지 않는 객체는 표시되지 않음.
📌 2. 사용되지 않는 객체 식별 (Sweep 단계)
- Mark되지 않은 객체를 찾아서 메모리에서 제거하는 단계.
- 사용되지 않는 객체는 더 이상 어떤 변수에서도 참조하지 않는 상태이므로 삭제 대상이 됨.
- JVM은 이 단계를 통해 불필요한 메모리를 회수하여 새로운 객체를 위한 공간을 확보한다.
📌 3. 메모리 단편화 정리 (Compaction 단계, 필요시 수행)
- GC가 객체를 삭제하면 힙 메모리에 "빈 공간(구멍)"이 생길 수 있음.
- 이러한 단편화(fragmentation)를 방지하기 위해 남아 있는 객체들을 한 곳으로 모아 재정렬(Compaction)하는 과정.
- 이 단계가 필요하지 않다면 수행되지 않으며, 힙 메모리를 효율적으로 사용하기 위해 필요할 때만 수행됨.
📌 정리하면?
단계설명
Mark 단계 | 사용 중인 객체를 식별하여 "살아 있는 객체"로 표시 |
Sweep 단계 | Mark되지 않은 객체(사용되지 않는 객체)를 삭제 |
Compaction 단계 | 메모리를 정리하여 단편화된 공간을 제거하고 새로운 객체를 위한 공간 확보 |
4. GC가 제거하는 대상 예제
class Person {
String name;
Person(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("Alice");
p1 = new Person("Bob"); // 기존 객체(Alice)는 GC 대상이 됨
System.gc(); // 명시적으로 GC 실행 요청 (보장되지 않음)
}
}
📌 "Alice" 객체는 더 이상 참조되지 않으므로, GC에 의해 제거될 수 있음.
5. GC의 주요 알고리즘
GC 알고리즘 | 특징 |
Mark and Sweep | 사용되지 않는 객체를 찾아 제거 |
Generational GC | 객체를 세대(Young, Old)로 나누어 관리 |
Reference Counting | 참조 개수를 이용하여 객체 제거 |
📌 System.gc();를 호출하면?
- GC 실행을 요청하지만 보장되지 않음.
- JVM이 GC 실행 여부를 결정하므로 즉시 실행되지 않을 수도 있음.
6. 정리
- 가비지 컬렉터(GC)는 힙(Heap)에서 사용되지 않는 객체를 자동으로 제거함.
- GC는 참조가 없는 객체를 찾고 제거하며, 메모리 정리를 수행하여 단편화를 방지함.
- GC는 단계적 처리 방식(객체 생성 → 참조 관리 → GC 실행 → 단편화 정리 → 프로그램 지속 실행)으로 동작함.
- System.gc();를 호출해도 즉시 실행이 보장되지 않으며, JVM이 GC 실행을 결정함.
- static 변수는 GC의 대상이 되지 않으며, 프로그램 종료 시까지 유지됨.
Java의 가비지 컬렉터를 이해하면 더 효율적인 프로그램을 작성할 수 있다! 🚀
'공부 > JAVA' 카테고리의 다른 글
자바의 클래스 (Java Class) (1) | 2025.03.07 |
---|---|
자바의 변수와 메서드(함수) (0) | 2025.03.07 |
Java의 입출력 (1) | 2025.03.05 |
자바의 시작 - 프로그램 셋팅 및 헬로우 월드 (0) | 2025.03.05 |