JAVA/JAVA기본
JAVA - Garbage Collection이란?
realizers
2021. 11. 28. 15:11
728x90
반응형
Garbage Collection이란?
Garbage Collector(GC)는 Heap 메모리에서 활동하며, JVM에서 GC의 스케줄링을 담당하여 개발자가 직접 관여하지 않아도 더이상 사용하지 않는 메모리를 제거해주는 역할을 담당합니다.
Person person = new Person();
person.setName("KDG");
person.setCity("seoul");
person = null;
// 가비지 발생
person = new Person();
person.setName("홍길동");
person.setCity("seoul");
GC는 간단하게 말하자면 Heap Area에서 더이상 사용하지 않는 메모리를 제거하는 것을 말합니다.
전통적인 Heap Area는 위의 사진에서 볼 수 있듯이 Eden, Survivor1, Survivor2, Old Generation으로 구분됩니다.
또한 Eden, Survivor1, Survivor2를 묶어서 Young Generation이라고도 부릅니다.
과정 예시
- Step 01 - 맨 처음 객체가 생성되면 Eden 영역에 생성이 됩니다. (Name이 KDG인 Person 객체 생성)
- Step 02 - GC의 일종인 Minor GC가 발생하면 미사용 객체의 제거와 함께 아직 사용되는 것으로 판단되는 객체들을 Survivor1 또는 Survivor2 영역으로 이동시킵니다.
- * 여기서 Survivor 영역을 거치지 않고 바로 Old Generation 영역으로 이동하는 경우가 있는데 이 경우는 객체의 크기가 Survivor 영역의 크기보다 클 경우입니다.
- Step 03 - 아직 사용되는 것으로 판단되는 객체들은 Survivor1 또는 Survivor2 영역의 둘중 한 곳으로 넘어오게 됩니다. 이때 객체는 두 곳 모두에 존재할 수 없으며 다른 한 곳은 비워있어야 합니다.
- Step 04 - 위의 과정(1 ~ 3)을 반복하면서 Survivor 영역에서 계속 살아남는 객체들에게 일정 score가 누적되는데, 기준치를 넘어가게 되면 Old Generation 영역으로 이동하게 됩니다.
- Step 05 - Old Generation 영역에서 살아남았던 객체들이 일정 수준 이상 쌓이게 되면 미사용 된다고 식별된 객체들을 제거해주는 Full GC가 발생하게 됩니다.
- 이 과정에서 STW(Stop-The-World)가 발생하게 됩니다.
- STW란, Old Generation 영역에 쌓인 많은 객체들을 효율적으로 제거해주기 위해 JVM이 잠시 멈추는 현상을 뜻합니다.
Garbage Collection의 종류
- Serial GC
- Parallel GC
- Concurrent Mark-Sweep(CMS) GC
- G1(Garbage First) GC
Serial GC
- 하나의 CPU로 Young 영영과 Old 영역을 연속적으로 처리하는 방식입니다.
- 가장 단순한 방식의 GC로 싱글 스레드(스레드 1개)로 작동합니다.
- 싱글 스레드로 동작하여 느리고, 그만큼 STW 시간이 다른 GC에 비해 깁니다.
- Mark & Sweep & Compact 알고리즘을 사용합니다.
Parallel GC
- Java 8의 Default GC
- Young 영역의 GC를 멀티 스레드 방식을 사용하기 때문에 Serial GC에 비해 상대적으로 STW가 짧습니다.
Concurrent Mark Sweep GC(CMS GC)
- STW로 Application이 멈추는 현상을 줄이고자 만든 GC
- Reacable 한 객체를 한번에 찾지 않고 나눠서 찾는 방식을 사용합니다. (4 STEP으로 나누어짐)
- Initial Mark 단계
- Class Loader에서 가장 가까운 객체 중 살아 있는 객체만 찾는 것으로 끝납니다.
- STW가 발생하긴 하나 매우 짧습니다.
- Concurrent Mark 단계
- 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인합니다.
- 이 단계의 특징은 다른 스레드가 실행 중인 상태에서 동시에 진행합니다.
- Remark 단계
- Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체가 있는지 한번더 마킹하여 확인하는 과정입니다.
- STW 발생
- Concurrent Sweep 단계
- 쓰레기를 정리하는 작업을 실행합니다. 해당 작업도 다른 스레드가 실행되고 있는 상황에서 진행합니다.
위와 같이 진행하므로 Stop-The-World가 최대한 덜 발생하도록 하여 Java Application이 멈추는 현상을 줄입니다.
단점은?
- 다른 GC 방식보다 메모리와 CPU를 더 많이 먹는다.
Garbage First GC (G1 GC)
- Java 9 이상의 Default GC
- 현재 GC중 Stop-The-World의 시간이 제일 짧음
- CMS GC를 개선하여 만든 GC로 지금까지의 GC와는 다른 구조를 가집니다.
- Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리합니다.
- 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하며 각각의 Region에만 GC가 발생합니다.
728x90
반응형