memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

JVM GC 동작 순서

요약하면 GC 동작은 아래 3 STEP으로 나눠진다.

 

  1. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다.
  2. GC Root에서 부터 시작하여 참조값을 따라가며 접근 가능한 객체들에 Mark하는 과정을 진행한다.
  3. Mark 되지 않은 객체 즉, 접근할 수 없는 객체는 제거(Sweep) 대상이 된고, 해당 객체들을 제거한다.

 

접근 가능한 객체 판단 과정

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)한다.

 

GC Root가 될 수 있는 대상

  • JVM 메모리의 Stack 영역에 존재하는 참조 변수
  • Method Area의 static 데이터
  • JNI에 의해 생성된 객체들

출처: https://d2.naver.com/helloworld/329631

 

용어 정리

Mark & Sweep & Compact

Mark: 접근 가능한 객체에 Mark하여 표시

Sweep: Mark되지 않은 객체들을 제거하는 과정

Compact: Sweep 과정에 의해 삭제되면 메모리 단편화가 발생하는데, Compact를 통해 빈자리들을 채워줌

출처: https://medium.com/@joongwon/jvm-garbage-collection-algorithms-3869b7b0aa6f

 

Promotion

Survivor 영역에서 계속해서 살아남은 객체들이 특정 age 값에 도달하면, Old Generation으로 이동하게 되는데 이 과정을 promotion이라고 함

 

GC 종류

Serial GC (-XX:+UseSerialGC)

  • 가장 단순한 방식의 GC로 싱글 스레드(스레드 1개)로 동작한다.
  • 싱글 스레드로 동작하여 느리고, 그만큼 Stop The World 시간이 다른 GC에 비해 길다.
  • Mark & Sweep & Compact 알고리즘을 사용
  • 보통 실무에서 사용하는 경우는 없음 (디바이스 성능이 안좋아서 CPU 코어가 1개인 경우에만 사용)

Serial GC

 

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

 

Parallel Old GC (-XX:+UseParallelOldGC / -XX:+ParallelGCThreads=n)

  • Parallel GC는 Young 영역에 대해서만 멀티 스레드 방식을 사용했다면, Parallel Old GCOld 영역까지 멀티스레드 방식을 사용
  • -XX:+ParallelGCThreads=n 옵션으로 멀티 스레드 개수를 지정할 수 있음

 

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이 멈추는 현상을 줄임

 

 

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가 발생한다.

 

관련 글

2021/03/07 - [Language/JAVA] - JVM GC(Garbage Collector) 구조

 

JVM GC(Garbage Collector) 정리

GC (Garbage Collector) JVM에는 메모리를 자동으로 관리해주는 특징이 있는데, 이 역할을 Garbage Collector (가비지 콜렉터)이 한다. Stop The World GC에는 stop-the-world 라는 것이 존재하여, 메모리가 관리..

memostack.tistory.com

2021/03/07 - [Language/JAVA] - JVM 메모리 (Runtime Data Area)

 

JVM 메모리 (Runtime Data Area)

Runtime Data Area JVM 메모리를 뜻함 Runtime Data Area 는 5개 영역으로 나눠짐 Method Area , Heap , Stack , PC Register , Native Method Area Method Area 와 Heap 은 모든 스레드가 공유하는 공간 Stack ,..

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!