Garbage Collection
프로그램에서 메모리 관리를 자동으로 수행해주는 중요한 기능
프로그래밍을 할 때 메모리 누수를 막기위해 객체를 생성한 후 사용하지 않는 객체의 메모리를 사용자가 직접 해제를
해줘야했는데 Java에서는 JVM ( Java Virtual Machine )이 구성된 JRE ( Java Runtime Environment )가 제공되며, 그 구성 요소중 하나인 Garbage Collection ( GC )이 자동으로 사용하지 않는 객체를 파괴합니다.
GC ( Garbage Collection )을 알아보기 전 "stop-the-world"라는 용어를 알고가야합니다.
"stop-the-world"는 GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것입니다.
GC알고리즘을 사용하더라도 stop-the-world는 발생하게되는데,
대개의 경우 GC튜닝은 이 stop-the-world시간을 줄이는 것입니다.
GC를 해도 더이상 사용 가능한 메모리 영역이 없는데 계속 메모리를 할당하려고 하면
OutOfMemoryError가 발생하여
WAS가 다운될수 있음 -> 서버가 요청을 처리 못하고 있는 상태
< Minor GC와 Major GC >
자바의 힙( Heap ) 메모리는 크게 Young Generation과 Old Generation으로 나뉩니다.

Young Generation
- Eden 영역와 Survivor 영역(S0, S1)로 구성됩니다.
- 새로 생성된 객체들은 대부분 Eden에 할당됩니다.
- Eden 영역에서 일정 시간이 지나면서 여전히 참조되는 객체는 Survivor 영역로 이동합니다.
- Young Generation에서의 GC를 Minor GC라고 합니다.
Old Generation
- Young Generation에서 오래 살아남은 객체들이 이 영역으로 이동합니다.
- Old Generation에서의 GC를 Major GC 또는 Full GC라고 합니다.
- Major GC는 전체 힙을 대상으로 하며, 실행 시간이 길어지는 경향이 있어 성능에 큰 영향을 미칠 수 있습니다.
< Minor GC >
Minor GC는 Young Generation에서 발생합니다.
새로 생성된 객체가 대부분 Eden 영역에 저장되고, Eden 영역이 꽉 차면 Minor GC가 실행됩니다.
Minor GC가 실행되면
1. 사용되지 않는 객체는 메모리에서 제거됩니다.
2. 참조되고 있는 객체는 Survivor 영역로 이동합니다.
3. 몇 차례의 Minor GC를 거친 후에도 살아남은 객체는 Old Generation으로 이동합니다.
< Major GC (Full GC) >
Major GC는 Old Generation에서 발생하며, 메모리에서 사용되지 않는 객체를 제거하고 힙 전체를 정리합니다.
Major GC는 일반적으로 Minor GC보다 시간이 오래 걸리고, 어플리케이션의 성능에 영향을 미칠 수 있습니다.
- Full GC는 Old Generation뿐 아니라, Young Generation까지 포함하여 전체 힙을 검사하고 정리합니다.
- Major GC가 자주 발생하면, 시스템의 성능 저하로 이어질 수 있으므로 이를 피하기 위해 힙 메모리 설정을 조정하거나 코드 최적화를 고려해야 합니다.

가비지 컬렉션 동작 방식
Young 영역과 Old영역은 서로 다른 메모리 구조로 되어 있기 때문에, 세부적인 동작 방식이 다릅니다.
하지만 기본적으로 GC을 실행된다고하면 2가지 공통적인 단계를 따르게됩니다.
1. Stop-The-World
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
2.Mark & Sweep
가비지 컬렉션에서는 GC Root라는 것이 존재하는데 말 그대로 GC Root는 가비지 컬렉션의 Root라는 뜻입니다.
GC Root : 힙( Heap ) 외부에서 접근할 수 있는 변수나 오브젝트
GC Root에서 시작해 GC Root가 참조하는 모든 오브젝트, 그 오브젝트들이 참조하는 다른 오브젝트들을
탐색해 내려가면서 마크 ( Mark )합니다.
GC Root가 될수 있는 것들
1. 실행중인 쓰레드
2. 정적 변수
3. 로컬 변수
4. JNI 레퍼런스
이게 가비지 컬렉션의 첫번째 단계인 Mark 단계입니다.
GC Root에서 시작하여 참조된 오브젝트

Sweep후 Heap 공간의 모습

가비지콜렉션의 첫번째 Mark 단계가 끝나면 가비지 콜렉터는 힙 내부 전체를 돌면서
Mark되지 않은 메모리들을 해제합니다.
이과정을 Sweep이라고 합니다.
'CS지식' 카테고리의 다른 글
| [운영체제] 프로세스, 스레드 개념과 차이점 (3) | 2024.08.08 |
|---|---|
| [Java] 데드락 ( DeadLock ) (2) | 2024.08.06 |
| [Java] 디자인패턴 (2) | 2024.08.04 |
| 클라우드 ( AWS ) 지식 (1) | 2024.08.02 |
| 운영체제와 WAS 정리 (1) | 2024.08.02 |