S E P H ' S
[Java] 3. 가비지컬렉션(Garbage Collection) 본문
가비지 컬렉션, GC(Garbage Collection)
GC는 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능입니다.
Minor GC
새로 생성된 대부분의 객체(Instance)는 Eden 영역에 위치합니다. Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Survivor영역 중 하나로 이동됩니다. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 일정시간 참조되고 있다는 뜻이고 Old영역으로 이동됩니다. 이를 Promotion이라고 합니다.
Major GC
Old영역에 있는 모든 객체들을 검사해 참조되지 않은 객체들을 한꺼번에 삭제합니다. 시간이 오래 걸리고 실행 중 프로세스가 정지됩니다. 이것을 'stop the world'라고 합니다. Major GC가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춥니다. GC작업이 완료 되어야 중단했던 작업을 다시 시작합니다.
# 가비지 컬렉션은 어떤 원리로 소멸시킬 대상을 선정하나요?
알고리즘에 따라 동작 방식이 매우 다양하지만 공통적인 원리가 있습니다. GC는 힙 내의 객체 중 Garbage를 찾아내고 그것을 처리하여 힙의 메모리를 회수합니다. 참조되고 있지 않은 객체를 Garbage라고 하며 객체가 Garbage인지 아닌지 판단하기 위해서 reachability라는 개념을 사용합니다. 어떤 힙 영역에 할당된 객체가 유효한 참조가 있으면 reachability, 없다면 unreachability로 판단합니다. 하나의 객체는 다른 객체를 참조하고, 다른 객체는 또 다른 객체를 참조할 수 있기 때문에 참조 사슬이 형성 됩니다. 이 참조 사슬 중 최초에 참조한 것을 Root Set이라고 칭합니다. 힙 영역에 있는 객체들은 총 4가지 경우에 대한 참조를 합니다.
1. 힙 내의 다른 객체에 의한 참조
2. Java 스택, 즉 Java 메소드 실행 시에 사용하는 지역변수와 파라미터들에 의한 참조 - JVM 메모리의 Stack 영역에 존재하는 참조변수
3. 네이티브 스택(JNI, Java Native Interface)에 의해 생성된 객체에 대한 참조 - JNI에 의해 생성된 객체들
4. 메소드 영역의 정적 변수에 의한 참조 - Method Area의 static 데이터
2,3,4번은 Root Set입니다. 최초에 참조한 것들입니다.
인스턴스가 GC의 대상이 되었다고 해서 바로 소멸되는 것은 아닙니다. 빈번한 GC의 실행은 시스템에 부담이 되므로 성능에 영향을 끼치지 않도록 GC 실행 타이밍은 별도의 알고리즘을 기반으로 계산이 되고, 이 결과를 바탕으로 GC가 실행됩니다. GC는 보통 다음의 방식으로 작동됩니다.
- Mark : 접근 가능한 객체에 Mark하여 표시
- Sweep : Mark되지 않은 객체들을 제거하는 과정
- Compact : Sweep 과정에 의해 삭제되면 메모리 단편화가 발생하는데, Compact를 통해 빈자리를 채워줌
GC 종류
Serial GC
- 메모리와 CPU 코어 개수가 적을 때 적합한 방식입니다.
- 가장 단순한 방식의 GC로 싱글 스레드로 동작합니다.
- Stop The World 시간이 다른 GC에 비해 깁니다.
- Mark & Sweep & Compact 알고리즘 사용
Parallel GC
- Java 8 의 default GC
- Young 영역의 GC를 멀티 스레드 방식으로 사용합니다. Serial GC에 비해 상대적으로 Stop The World 시간이 짧습니다.
- 메모리가 충분하고 코어의 개수가 많을 때 유리합니다.
Parallel Old GC
- Parallel GC는 Young영역에 대해서만 멀티 스레드 방식을 사용했지만, Old영역까지 멀티 스레드 방식을 사용합니다.
CMS GC(Concurrent Mark Sweep GC)
Stop The World로 Java Application이 멈추는 현상을 줄이고자 만든 GC입니다.
Reachable 한 객체를 한번에 찾지 않고 4단계로 나눠서 찾는 방식을 사용합니다.
- Initial Mark : GC Root 가 참조하는 객체만 마킹 (stop-the-world 발생)
- Concurrent Mark : 참조하는 객체를 따라가며, 지속적으로 마킹 (stop-the-world 없이 이뤄짐)
- Remark : Concurrent Mark 과정에서 변경된 사항이 없는지 다시 한번 마킹하며 확정하는 과정 (stop-the-world 발생)
- Concurrent Sweep : 접근할 수 없는 객체를 제거하는 과정 (stop-the-world 없이 이뤄짐)
G1 GC (Garbage First GC)
- Java 9+ 의 default GC
- 현재 GC중 stop-the-world 시간이 제일 짧습니다.
- CMS GC를 개선하여 만든 GC로 위의 GC와는 다른 구조를 가집니다.
- Heap을 Region이라는 일정한 부분으로 나눠 메모리를 관리합니다.
- 전체 Heap에 대해 탐색하지 않고 부분적으로 Region 단위로 탐색하며, 각각의 Region에만 GC가 발생합니다.
참고링크
'Programing & Coding > JAVA' 카테고리의 다른 글
[Java] 5. Collection (Stack, Queue) (0) | 2022.01.04 |
---|---|
[Java] 4. Collection (List, Map, Set) (0) | 2021.12.28 |
[Java] 2. 자바 가상 머신 (JVM) (0) | 2021.12.17 |
[Java] 1. Java, 왜 사용할까? (0) | 2021.12.17 |
Comparable, Comparator (0) | 2021.02.21 |