Garbeage Collection (GC 또는 가비지 컬렉션)
GC는 JVM 안 → 런타임 데이터 영역 안 → Heap 영역 안에서 동적으로 할당했던 메모리 영역 중 필요 없게 된 메모리 영역을 주기적으로 삭제하는 프로세스를 말한다. C/C++는 메모리를 개발자 직접 할당하거나 해제 하기때문에 매우 불편하다. 반면 JAVA는 JVM안에 탑재되어있는 가비지컬렉션이 자동으로 메모리를 관리해주기 때문에 개발자가 신경 쓰지 않아도 되는 장점이 있다. 그래도 단점은 존재한다.
- 개발자가 메모리가 언제 해제되는지 알 수 없다.
- 가비지 컬렉션이 동작하는 동안은 가비지 컬렉션 안에 스레드 제외 모든 스레드가 동작을 멈추기 때문에 오버헤드 문제가 발생할 수 있다.
GC 대상이 되는 객체들

Heap Area는 실질적으로 객체 인스턴스를 갖고 있다.
반면 Method Area나 Stack Area 에서는 Heap Area안에 객체인스턴스를 참조변수를 통하여 참조주소만 갖고있다.
특정 이벤트를 통하여 Method Area나 Stack Area에서 참조변수가 삭제되는 현상이 생긴다면 위 그림처럼 Heap Area 안에는 왕따처럼 혼자 남아있는 객체가 있을 것이다.
혼자 남아있는 객체가 바로 GC에 대상이다. 이러한 객체들은 Unreachable 하다고 한다.
- Unreachable : 객체가 참조되고 있지 않은 상태 (GC의 대상이 됨)
- Reachable : 객체가 참조되고 있는 상태
GC에 동작원리

GC는 Mark And Sweep 과정을 통하여 메모리를 관리하는데 총 3가지에 과정이 존재한다.
- Mark 과정 : Root 부터 그래프를 순회하며 참조되고있는 객체를 마킹한다.
- Sweep과정 : 참조되지 않는 객체들을 찾아 Heap에서 제거한다.
- Compact 과정 : Sweep 과정을 통하여 객체들이 제거되었다면 빈 메모리들이 존재하겠죠? Compact 과정은 분산된 객체 주소들을 모아 메모리가 할당된 부분 과 메모리가 할당되지 않는 부분을 압축한다. 쉽게 생각하면 정렬해주는 것이다.
GC의 대상이 되는 Heap 영역

Young generation 과 Old generation만 봐도 느낌이 올 것이다.
- 인스턴스가 생성되면 Eden 영역으로 먼저 들어온다.
(Eden은 에덴동산 태초에? 이런느낌) - Eden 영역이 꽉차면 Minor GC가 발생한다. Minor GC가 발생하고 살아남은 객체들은 age-bit가 1씩 증가한다.
- Minor GC을 통하여 살아남은 인스턴스들은 Survlval0 영역으로 이동한다.
- Eden 영역이 또 꽉차면 Minor GC가 발생한다. 그리고 비어있는 Survlval1 영역으로 이동하고 age-bit가 1씩 증가한다.

- 위에 과정을 계속 반복하다보면 일정 수준 age-bit 넘어선다면 JVM은 이 객체를 오래쓰겠구나! 라고 판단하고 Old generation 영역으로 보내버린다. 이 과정을 프로모션 이라고 한다.
- 시간이 오래 지나 Old generation 영역 또한 꽉차게 된다면 GC가 가동이 될텐데 이때 가동하는 GC를 Major GC라고 부른다. Major GC는 오래 걸리는 작업이기에 스레드를 중단하고 모든 스레드 작업을 중지하고 실행시키는데 이를 'Stop the World’ 라고 부른다. 이 작업이 잦으면 성능 저하 원인이 될 수 있다.
참고 블로그
[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리
[Java] 가비지 컬렉션(GC, Garbage Collection) 총정리
가비지 컬렉션(Garbage Collection)이란? 가비지 컬렉션은 영어로 Garbeage Collection으로 줄여서 GC라고도 부릅니다. 가비지 컬렉션은 자바의 메모리 관리 방법 중의 하나로 JVM의 Heap 영역에서 동적으로
coding-factory.tistory.com
'JAVA' 카테고리의 다른 글
| Optional 더 잘 사용해보기 (0) | 2023.04.10 |
|---|---|
| Java8 : Stream 사용법 (0) | 2023.03.31 |
| sigton Patten이란? (0) | 2023.03.31 |
| JAVA 동작원리 그리고 JVM (0) | 2023.03.30 |
| Comparable 과 Comparator 차이점 (0) | 2023.03.30 |