https://memostack.tistory.com/229
1. JVM GC 동작 순서
요약하면 GC 동작은 아래 3 STEP으로 나눠진다.
- Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다.
- GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다.
- Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다.
1.1. 접근 가능한 객체 판단 과정
GC Root에서 시작해서 참조하는 객체를 찾고, 또 그 객체가 참조하는 객체를 찾아가며 Mark 한다. (아래 그림 참고)
출처: https://velog.io/@mu1616/%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98-GC
Mark 되지 않은 객체는 접근할 수 없는 객체 (Unreachable Object)로 판단하고 메모리를 돌며 제거(Sweep)한다.
1.2. GC Root가 될 수 있는 대상
- JVM 메모리의 Stack 영역에 존재하는 참조 변수
- Method Area의 static 데이터
- JNI에 의해 생성된 객체들
출처: https://d2.naver.com/helloworld/329631
2. 용어 정리
2.1. Mark & Sweep & Compact
Mark: 접근 가능한 객체에 Mark하여 표시
Sweep: Mark되지 않은 객체들을 제거하는 과정
Compact: Sweep 과정에 의해 삭제되면 메모리 단편화가 발생하는데, Compact를 통해 빈자리들을 채워줌
출처: https://medium.com/@joongwon/jvm-garbage-collection-algorithms-3869b7b0aa6f
2.2. Promotion
Survivor 영역에서 계속해서 살아남은 객체들이 특정 age 값에 도달하면, Old Generation으로 이동하게 되는데 이 과정을 promotion이라고 함
3. GC 종류
3.1. Serial GC (-XX:+UseSerialGC)
- 가장 단순한 방식의 GC로 싱글 스레드(스레드 1개)로 동작한다.
- 싱글 스레드로 동작하여 느리고, 그만큼 Stop The World 시간이 다른 GC에 비해 길다.
- Mark & Sweep & Compact 알고리즘을 사용
- 보통 실무에서 사용하는 경우는 없음 (디바이스 성능이 안좋아서 CPU 코어가 1개인 경우에만 사용)
Serial GC
3.2. Parallel GC (-XX:+UseParallelGC)
- Java 8의 default GC
- Young 영역의 GC를 멀티 스레드 방식을 사용하기 때문에, Serial GC에 비해 상대적으로 Stop The World 가 짧다
- Old 영역은 아님
출처: https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html
3.3. Parallel Old GC (-XX:+UseParallelOldGC / -XX:+ParallelGCThreads=n)
- Parallel GC는 Young 영역에 대해서만 멀티 스레드 방식을 사용했다면, Parallel Old GC는 Old 영역까지 멀티스레드 방식을 사용
- -XX:+ParallelGCThreads=n 옵션으로 멀티 스레드 개수를 지정할 수 있음
3.4. CMS GC(Concurrent Mark Sweep GC)
Stop The World로 Java Application이 멈추는 현상을 줄이고자 만든 GC
Reacable 한 객체를 한번에 찾지 않고 나눠서 찾는 방식을 사용 (4 STEP으로 나눠짐)
Concurrent Mark Sweep GC
- 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이 멈추는 현상을 줄임
3.5. G1 GC (Garbage Frist GC) (-XX:+UseG1GC)
- Java 9+ 의 default GC
- 현재 GC 중 stop-the-world의 시간이 제일 짧음
- CMS GC 를 개선하여 만든 GC로 위에서 살펴본 GC와는 다른 구조를 가진다. (아래 그림 참고)
출처: https://mirinae312.github.io/develop/2018/06/04/jvm_gc.html
- Heap을 Region이라는 일정한 부분으로 나눠서 메모리를 관리한다.
- 전체 Heap에 대해서 탐색하지 않고 부분적으로 Region 단위로 탐색하여, 각각의 Region에만 GC가 발생한다.
출처: https://memostack.tistory.com/229#toc-JVM GC 동작 순서 [MemoStack]
'프로그래밍 > java' 카테고리의 다른 글
Java EE에서 Jakarta EE로의 전환 (0) | 2021.11.18 |
---|