GC in JVM, JAVA

Developer:Bird·2022년 3월 11일
0

GC in JAVA

default로 Java의 GC는 Mark and Sweep 방식으로 작동하고 가장 중요한 특징은 아래 두가지이다.

  • 의도적으로 GC를 실행시켜야 한다.
  • 애플리케이션 실행과 GC 실행이 병행된다.

이를 염두해두고 특징들을 살펴보자.

JVM ROOT SPACE

JVM에서의 RootSpace(GC가 동작할 루트공간)은 Heap일텐데 JVM MEMORY에서는 다음을 가지고 있다.

  • Stack의 로컬 변수
  • Method Area의 Static 변수
  • Native Method Stack의 JNI 참조

GC 동작시점

의도적으로 GC를 실행시켜야 한다고 했는데 이는 기준을 바탕으로 특정 순간 동작하도록 만들어야 한다는것이다.
JVM HEAP을 살펴보자.

위는 크게 두 영역인 Young Generation, Old Generation으로 나뉘고 전자에서 발생하는 GC는 minor gc이고 후자에서 생성되는것은 major gc이다. 또한 age bit의 개념을 알아야 하는데 이것은 GC의 횟수에 비례해서 증가한다.

  • Young Generation
    • Eden: 새롭게 객체 생성되는곳
    • Survival0 + Survival1: 둘중 한곳은 꼭 비어 있어야함.

STEP

  1. 객체 생성시 Eden에 생성
  2. Eden영역 Full일 경우
    GC실행 -> reachable 객체 Survival 0으로 이동
  3. Survival0이 Full일 경우
    GC실행 -> reachable 객체 Survival 1으로 이동 -> age bit증가
  4. Survival1이 Full일 경우
    GC실행 -> reachable 객체 Survival 0으로 이동 -> age bit증가
  5. Age bit이 특정 값 이상되면 Old Generation으로 옮겨 지게 된다. 이를 Promotion이라고 한다.
  6. Old Generation도 가득차면 major gc가 발생한다.

이를 그림으로 살펴보자.
Eden영역 Full일 경우
Survival 0으로 이동하고 age bit은 증가
Survival 0도 꽉찬 이후 Survival1로 이동
최대 Age bit이 3이 되고, 한계치에 도달한다.(커스텀하게 설정가능)
Age bit이 3이 된 데이터는 Old Generation으로 이동하게 되고 이를 Promotion이라고 한다.
Old Generation로 꽉차게 되고 major gc가 일어난다.

Why This Structure

다음과 같이 나눈 이유는 GC설계자들이 객체 수명이 짧다는 것을 깨달아서이다. 메모리의 특정 부분만을 탐색하며 Young Generation만 해제하면 효율적이기 때문이다.

GC 실행 방식

Mark And Sweep의 두번째 특징으로 "애플리케이션 실행과 GC 실행이 병행된다." 라고 하였다. 그말은 GC가 실행되는 동안 잠시 애플리케이션을 정지 한다는것을 의미하고 왜 멈출수밖에 없냐면, 동시에 한개의 객체에 멀티 프로세스가 접근하게 되어서 삭제하거나 하게 되면 충돌이나 앱 안전성에 문제가 발생할 수 도 있기 때문이다.

Serial GC


Serial GC는 하나의 쓰레드로 GC를 실행하는 방식이다.
하나의 쓰레드로 GC를 실행시키다 보니 Stop-The-World 시간이 길다.

Parallel GC


Parallel GC는 여러 개의 쓰레드로 가비지 컬렉션을 수행하여 Stop-The-World가 짧고 Java8에서 default로 사용된다.

CMS GC(Concurrent-Mark-Sweep)


대부분의 가비지 수집 작업을 어플리케이션 스레드와 동시에 수행하여, Stop The World 시간을 최소화시킨다.
하지만 메모리와 CPU를 많이 사용하고, Mark-And-Sweep 과정 이후 메모리 파편화를 해결하는 Compaction이 기본적으로 제공되지 않는다.

G1 GC(Garbage first GC)


Heap을 일정 크기의 Region으로 잘게 나누어 Young Generation, Old Generation으로 쓴다.
런타임에 G1 GC가 필요에 따라 영역별 Region 개수를 튜닝한다. 그에 따라 Stop the world를 최소화 할 수 있다.
java 9이상부터 G1 GC를 이용한다.

참조: https://joel-dev.site/94

profile
끈임없이 발전하자.

0개의 댓글