가비지 컬렉션(Garbage Collection)이란?
- 자바의 메모리 관리 방법
- JVM의 Heap 영역에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스
- C언어는 free()라는 함수를 통해 직접 메모리를 해제해주어야 하지만 자바는 JVM의 가비지 컬렉터가 불필요한 메모리를 알아서 정리해준다.
장점
- 메모리 누수 방지
- 해제된 메모리에 접근 방지
- 해제한 메모리를 또 해제하는 이중 해제 방지
단점
- 개발자가 메모리가 언제 해제되는지 정확하게 알 수 없다.
- 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생한다.
- Stop-The-World(STW) : GC를 수행하기 위해 JVM이 프로그램 실행을 멈추는 현상
- 이로 인해 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 생긴다
가비지 컬렉션 대상
JVM 메모리에서 객체들은 실질적으로 Heap Area에서 생성된다. Root Area에서는 Heap Area에 생성된 객체의 주소만 참조하는 형식으로 구성된다. 만약 Heap Area 객체의 메모리 주소를 가지고 있는 참조 변수가 삭제되는 현상이 발생하면, 어디서도 참조하고 있지 않은 객체들이 발생하고, 가비지 컬렉션의 대상이 된다.
- Reachable : 객체가 참조되고 있는 상태
- Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨)
가비지 컬렉션 청소 방식
GC가 Unreachable한 객체를 청소하는 방식
Mark And Sweep
- Mark And Sweep 은 GC가 동작하는 아주 기초적인 청소 과정이다.
- 가비지 컬렉션이 될 대상 객체를 식별(Mark)하고 제거(Sweep)하며 객체가 제거되어 파편화된 메모리 영역을 앞에서부터 채워나가는 작업(Compaction)을 수행
- Mark : 먼저 Root로부터 그래프 순회를 통해 연결된 객체들을 찾아내어 각각 어떤 객체를 참조하고 있는지 찾아서 마킹
- Sweep : 참조하고 있지 않은 객체 즉 Unreachable 객체들을 Heap에서 제거
- Compact : Sweep 후에 분산된 객체들을 Heap의 시작 주소로 모아 메모리가 할당된 부분과 그렇지 않은 부분으로 압축
- Mark And Sweep 방식을 사용하면 루트로부터 연결이 끊긴 순환 참조되는 객체들을 모두 지울수 있다.
가비지 컬렉션 동작방식
Heap영역은 객체는 대부분 일회성되며, 메모리에 오랫동안 남아있는 경우는 드물다는 전제로 설계되었다.
따라서 JVM에서 보다 효율적인 메모리 관리를 위해 객체의 생존 기간에 따라 물리적인 Heap영역을 Young 과 Old 총 2가지 영역으로 나누게 된다.
Young Genration
- 새롭게 생성된 객체가 할당되는 영역
- Young Generation에 대한 가비지 컬렉션을 Minor GC라고 부른다.
Old Genration
- Young Generation에서 가비지 컬렉션의 대상이 되지 않고, Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
- Young Generation보다 크게 할당되며, 가비지는 적게 발생한다.
- Old Generation에 대한 가비지 컬렉션을 Major GC라고 부른다.
효율적은 GC를 위해 Young Generation을 다시 3가지 영역으로 나눈다.
Eden
- 새로 생성된 객체가 위치
- 정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor 영역으로 보냄
Survivor 0 / Survivor 1
- 최소 1번의 GC 이상 살아남은 객체가 존재하는 영역
- Survivor 0과 Survivor 1 중 하나는 꼭 비어있어댜 한다.
가비지 컬렉션 동작과정
Minor GC 실행 과정
- 처음 생성된 객체는 Young Generation의 일부인 Eden영역에 위치
- 객체가 계속 생성되어 Eden영역이 꽉 차면 MinorGC 실행
- Mark 동작을 통해 reachable 객체를 탐색
- Eden 영역에서 살아남은 객체는 1개의 Survivor 영역으로 이동
- Eden 영역에서 사용되지 않는 객체(unreachable)의 메모리를 해제(sweep)
- 살아남은 모든 객체들은 age-bit값이 1씩 증가
- 또다시 Eden 영역에 신규 객체들로 가득 차게 되면 다시한번 minor GC 발생, marking 한 객체들은 비어있는 Survivor 영역으로 이동
- 살아남은 객체들은 age-bit값이 1씩 증가하고 이 과정을 반복
Major GC 실행 과정
- Young Generation에 의해 시작되었으나, GC 과정 중에 제거되지 객체는 age-bit가 임계값에 도달하면 Old genration으로 이동하는 Promoiton이 발생한다.
- 객체들이 계속 이동하여 Old 영역의 메모리가 가득 차면 MajorGC가 실행되어 참조되지 않는 객체들을 한꺼번에 삭제한다.
- 위 과정이 반복된다.
- Old Generation은 Young Generation에 비해 상대적으로 큰 공간을 가지고 있어 Major CG는 상대적으로 시간이 오래걸린다.
- 이 과정에서 Stop-The-World 문제가 발생하고 GC 튜닝 과정을 통해 STW 시간을 줄이는 것이 성능을 개선하는데 중요한 역할을 한다.
참고
☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리
Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객
inpa.tistory.com
[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리
가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부릅니다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로
coding-factory.tistory.com
'Java' 카테고리의 다른 글
[Java] 진법 변환 정리 (0) | 2023.04.24 |
---|---|
[Java] 가비지 컬렉터 (Garbage Collector) (0) | 2023.03.07 |
[Java] 맵(Map)과 HashMap (0) | 2023.02.28 |
[Java] JVM, JRE, JDK가 뭔가요? (0) | 2023.02.27 |
[Java] Scanner 클래스와 메서드(입력) (0) | 2023.02.27 |