Java Garbage Collection 이란? Mark and Sweep, Young, Old, Perm 개념 정리
- Java 프로그래밍을 하다보면 Garbage Collection 이라는 용어를 자주 듣게 됩니다. 개발 초반에는 해당 지식이 없어도 개발이 가능하지만, 성능 최적화나 메모리 누수 등을 방지하기 위해 알아두면 좋은 내용입니다.
- Java 를 사용하는 회사 면접에서도 자주 물어보는 주제 중 하나입니다.
- 이 문서에서는 Java Garbage Collection 에 대해 쉽게 이해할 수 있도록 정리해보겠습니다.
- 모르는 개념을 이해하기 위하여 간단히 정리한 내용이므로, 자세한 내용은 다른 글을 확인하면서 공부하시는 것을 추천드립니다.
Garbage Collection 이란?
- Garbage Collection 이라는 이름은 쓰레기 수집이라는 뜻. 사용하지 않는 메모리를 자동으로 수집하는 기능
- 사용하지 않는 메모리: 더 이상 사용되지 않는 메모리
- 메모리 수집: 사용하지 않는 메모리를 해제하여 다시 사용할 수 있도록 함
- 자바 메모리 관리는 JVM을 통해 이루어짐
- 기존 언어는 메모리 할당과 해제를 프로그래머가 직접 처리해야 했음. 메모리 해제를 제대로 하지 않으면 사용하지 않는 메모리가 계속 쌓여 메모리 누수(memory leak)가 발생
- JVM은 가상머신으로, 사용자가 신경쓸 필요 없이 자동으로 메모리 할당과 해제를 처리함
- 프로그램 실행시 JVM 옵션을 주어서 JVM 이 사용할 메모리 크기를 지정
- OS 레벨의 메모리에 직접 접근하지 않아 OS 레벨에서의 memory leak은 방지 됨
- Garbage Collection은 힙 영역에서 unreachable 객체들을 제거하여 메모리를 확보함
- unreachable 객체: 더 이상 참조되지 않는 객체
Mark and Sweep 이란?
- 특징
- 가비지 컬렉션은 Mark and Sweep 방식으로 이루어짐
- 가비지 컬렉션 후의 메모리 상태는 메모리 공간이 확보된 상태
Mark
- Reachable 객체를 찾아 마킹함. Garbage Collector 가 스택의 모든 변수를 스캔하면서 각각 어떤 오브젝트를 레퍼런스하는지 찾음
- Mark 작업을 위해 모든 스레드는 중단되는데, 이를 stop the world 라고 함
- 위의 이유로 System.gc()를 호출하여 명시적으로 가비지 컬렉션을 일으킬 수 있으나 권장되지 않음
Sweep
- 특징
- 마킹되지 않은 객체를 제거함. Unreachable Object 제거
Heap 영역 - Young (Eden, Survivor), Old, Perm
- Heap 영역은 Young Generation, Old Generation, Perm 영역으로 구성됨
- 총 5개의 영역으로 구성됨
- Young Generation: Eden, Survivor 0, Survivor 1
- Old Generation
- Perm 영역

Young Generation
- Eden 영역, Survivor 0, Survivor 1 영역으로 구성
- Eden 영역
- 새로 생성된 객체가 위치하는 곳
- Eden 영역이 가득차면 Minor GC 발생
- Survivor 영역
- Eden 영역에서 살아남은 객체가 위치하는 곳
- S0, S1 두 영역이 있으며, 둘 중 하나는 비어있고 다른 하나는 살아남은 객체가 위치
- 비어 있는 Survivor 영역으로, Eden 영역과 비어 있지 않은 Survivor 영역의 살아남은 객체를 이동
- Survivor 영역에서 다른 Survivor 영역으로 이동할 때 age 값이 증가
- 하기와 같이 이동
- S0 에 살아남은 객체가 있고, S1 은 비어있음 -> Eden 영역과 S0 의 살아남은 객체를 S1 으로 이동
- S1 에 살아남은 객체가 있고, S0 은 비어있음 -> Eden 영역과 S1 의 살아남은 객체를 S0 으로 이동
- 이동할 때는 age 값이 증가 살아남은 객체는 다른 Survivor 영역으로 이동
Old Generation
- 특징
- Young Generation에서 살아남은 객체가 age 값이 특정값 이상이 되면 Old Generation 으로 옮겨짐
- 위 단계를 Promotion 이라고 함
Perm 영역
- 특징
- 메타데이터, 클래스 정보 등이 저장되는 곳
- Java 8 부터는 Metaspace 로 변경됨
Minor GC & Major GC & Full GC
- 정리하는 Heap 의 영역에 따라 GC 를 Minor GC, Major GC, Full GC 로 구분함
Minor GC
- 특징
- Young Generation에서 발생하는 GC
- Eden 영역에서 살아남은 객체를 Survivor 영역으로 이동
- Survivor 영역이 가득차면, 살아남은 객체를 Old Generation으로 이동
- 순서
- Eden 영역이 가득차면 Minor GC 발생
- Eden 영역과 Survivor 영역의 살아남은 객체를 비어있는 Survivor 영역으로 이동
Eden + S0 -> S1
or Eden + S1 -> S0
- 이동할 때 age 값이 증가
Major GC
- 특징
- Old Generation에서 발생하는 GC
- Old Generation 영역이 가득차면 Major GC 발생
- Old Generation 영역에서 unreachable 객체를 제거함
Full GC
- 특징
- Young Generation, Old Generation, Perm 영역 전체에서 GC 수행
- Full GC가 발생하면 모든 스레드가 중단됨
- Full GC가 발생하면 Major GC, Minor GC, Perm 영역 GC가 모두 발생