on
JAVA - Garbage Collection이란?
JAVA - Garbage Collection이란?
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 객체 생성)
- 맨 처음 객체가 생성되면 Eden 영역에 생성이 됩니다. (Name이 KDG인 Person 객체 생성) Step 02 - GC의 일종인 Minor GC가 발생하면 미사용 객체의 제거와 함께 아직 사용되는 것으로 판단되는 객체들을 Survivor1 또는 Survivor2 영역으로 이동시킵니다. * 여기서 Survivor 영역을 거치지 않고 바로 Old Generation 영역으로 이동하는 경우가 있는데 이 경우는 객체의 크기가 Survivor 영역의 크기보다 클 경우입니다.
- GC의 일종인 Minor GC가 발생하면 미사용 객체의 제거와 함께 아직 사용되는 것으로 판단되는 객체들을 Survivor1 또는 Survivor2 영역으로 이동시킵니다. Step 03 - 아직 사용되는 것으로 판단되는 객체들은 Survivor1 또는 Survivor2 영역의 둘중 한 곳으로 넘어오게 됩니다. 이때 객체는 두 곳 모두에 존재할 수 없으며 다른 한 곳은 비워있어야 합니다.
아직 사용되는 것으로 판단되는 객체들은 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
from http://kdg-is.tistory.com/215 by ccl(A) rewrite - 2021-11-28 16:01:50