블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
JVM GC 동작 순서
요약하면 GC 동작은 아래 3 STEP으로 나눠진다.
- Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다.
- GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다.
- Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다.
접근 가능한 객체 판단 과정
GC Root에서 시작해서 참조하는 객체를 찾고, 또 그 객체가 참조하는 객체를 찾아가며 Mark 한다. (아래 그림 참고)
Mark 되지 않은 객체는 접근할 수 없는 객체 (Unreachable Object)로 판단하고 메모리를 돌며 제거(Sweep)한다.
GC Root가 될 수 있는 대상
- JVM 메모리의
Stack
영역에 존재하는 참조 변수 - Method Area의
static
데이터 JNI
에 의해 생성된 객체들
용어 정리
Mark & Sweep & Compact
Mark
: 접근 가능한 객체에 Mark하여 표시
Sweep
: Mark되지 않은 객체들을 제거하는 과정
Compact
: Sweep 과정에 의해 삭제되면 메모리 단편화가 발생하는데, Compact를 통해 빈자리들을 채워줌
Promotion
Survivor 영역에서 계속해서 살아남은 객체들이 특정 age 값에 도달하면, Old Generation으로 이동하게 되는데 이 과정을 promotion
이라고 함
GC 종류
Serial GC (-XX:+UseSerialGC)
- 가장 단순한 방식의 GC로 싱글 스레드(스레드 1개)로 동작한다.
- 싱글 스레드로 동작하여 느리고, 그만큼
Stop The World
시간이 다른 GC에 비해 길다. Mark & Sweep & Compact
알고리즘을 사용- 보통 실무에서 사용하는 경우는 없음 (디바이스 성능이 안좋아서 CPU 코어가 1개인 경우에만 사용)
Parallel GC (-XX:+UseParallelGC)
Java 8
의 default GC- Young 영역의 GC를 멀티 스레드 방식을 사용하기 때문에,
Serial GC
에 비해 상대적으로Stop The World
가 짧다- Old 영역은 아님
Parallel Old GC (-XX:+UseParallelOldGC / -XX:+ParallelGCThreads=n)
Parallel GC
는 Young 영역에 대해서만 멀티 스레드 방식을 사용했다면,Parallel Old GC
는Old
영역까지 멀티스레드 방식을 사용-XX:+ParallelGCThreads=n
옵션으로 멀티 스레드 개수를 지정할 수 있음
CMS GC(Concurrent Mark Sweep GC)
Stop The World
로 Java Application이 멈추는 현상을 줄이고자 만든 GC
Reacable
한 객체를 한번에 찾지 않고 나눠서 찾는 방식을 사용 (4 STEP
으로 나눠짐)
Initial Mark
: GC Root가 참조하는 객체만 마킹 (stop-the-world 발생)Concurrent Mark
: 참조하는 객체를 따라가며, 지속적으로 마킹. (stop-the-world 없이 이루어짐)Remark
: concurrent mark 과정에서 변경된 사항이 없는지 다시 한번 마킹하며 확정하는 과정. (stop-the-world 발생)Concurrent Sweep
: 접근할 수 없는 객체를 제거하는 과정 (stop-the-world 없이 이루어짐)
위와 같이 stop-the-world가 최대한 덜 발생하도록 하여, Java Application이 멈추는 현상을 줄임
G1 GC (Garbage Frist GC) (-XX:+UseG1GC)
Java 9+
의 default GC- 현재 GC 중 stop-the-world의 시간이 제일 짧음
- CMS GC 를 개선하여 만든 GC로 위에서 살펴본 GC와는 다른 구조를 가진다. (아래 그림 참고)
- Heap을
Region
이라는 일정한 부분으로 나눠서 메모리를 관리한다. - 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하여, 각각의 Region에만 GC가 발생한다.
관련 글
2021/03/07 - [Language/JAVA] - JVM GC(Garbage Collector) 구조
2021/03/07 - [Language/JAVA] - JVM 메모리 (Runtime Data Area)
반응형
'Language > JAVA' 카테고리의 다른 글
Java - String Pool에 대해서 (0) | 2021.03.07 |
---|---|
Java의 String과 StringBuilder, StringBuffer 비교 (0) | 2021.03.07 |
JVM GC(Garbage Collector) 구조 (0) | 2021.03.07 |
JVM 메모리 (Runtime Data Area) (0) | 2021.03.07 |
JVM과 JVM 아키텍처 (Class Loader, Runtime Data Area, Execution Engine) (0) | 2021.03.07 |