GC란 무엇인가?

고승원·2022년 12월 8일
0

CS

목록 보기
1/12
post-thumbnail

GC

GC(Garbage Collector)는 JVM의 heap 영역에 할당한 메모리 영역중 사용하지 않는 영역을 탐지하여 해제(제거)한다.

자바에서는 개발자가 메모리를 직접 해제할 수 없기 때문에 GC가 필요하게 된다.

GC는 어떻게 작동할까??

먼저 JVM의 heap 영역의 구조부터 알아야 한다.

  • Young Generation : 새롭게 생성하는 객체들이 존재하는 곳
  • Old Generation : Young Generation 영역에서 오래동안 살아남은 객체(가중치)들이 존재하는 곳
  • Meta Space : 클래스의 메타데이터, 문자열 정보를 저장하는 영역 (자바 8부터 생김)
  • YG와 OG로 나눈 이유는 어플리케이션에서의 객체의 수명은 대부분이 짧기 때문에 효율적으로 관리하기 위함이다.

GC 알고리즘

Reference Counting

  • Root Space에 접근할 수 있는 방법(참조하는 곳)이 없는 객체는 삭제 대상이 된다.
  • 순환참조에 대해 문제가 발생한다.

Mark-Sweep-Compact

  • JVM에서 사용하는 방식
  • Root Space에서부터 순환을 하여 방문한 객체에 Mark를 한다.
    JVM에서 Root Space는 stack, method stack, method 영역을 뜻한다.
  • Mark가 되지 않은 객체, 즉 방문하지 않은 객체는 삭제(Sweep) 대상이 된다.
  • 남아있는 객체들은 정리(Compact)한다.
  • 여기서 Compact는 필수가 아니다.
  • 의도적으로 GC를 실행시켜야 되기 때문에 Stop The World가 발생한다.
  • Stop The World : GC를 위해 어플리케이션을 일시적으로 멈추는 것

Young Generation과 Old Generation에서의 GC는 다르게 나타난다.

YG

  1. 새로운 객체는 Eden영역에 생성이 된다.
  2. Eden영역이 가득차면 (Minor)GC를 발생시키고 살아남은 객체는 age(가중치)를 증가시키고 Survival 0 또는1 로 이동한다.
  3. Survival 0 또는 1 중 하나는 항상 비어있어야 한다. 앞으로 Survival은 S로 부르겠다.
  4. 1~3을 반복하며 age가 threshold를 넘으면 Old Generation 영역으로 이동한다. (Promotion)
  5. S 0 또는 1 이 꽉차게 되어도 GC 발생

OG

  1. Old Generation 영역이 가득차면 (Major)GC가 발생한다.
  2. Major GC는 여러가지 종류가 있음.

Major GC의 종류

Serial GC

  • 하나의 스레드로 Mark Sweep Compact 알고리즘을 사용하여 OG 영역의 객체를 지운 뒤 정리한다.
  • 적은 메모리와 CPU코어에 적합한 방법
  • Stop The World 시간이 길다.

Parallel GC

  • Serial GC와 같은 방식이지만, YG 영역에 대하여 멀티 스레드로 처리한다.
  • Serial GC에 비해 Stop The World 시간이 짧지만, CPU를 많이 사용하기 때문에 적은 메모리에 대해서는 비효율적이다.

Parallel Old GC

  • Parallel GC와 같지만 OG 영역까지 멀티 스레드로 처리한다.
  • Java 8의 default 방식이다.

CMS GC

  • Stop The World를 최소화 하기 위해 고안한 방법으로 4 단계가 있다.
  1. Initial Mark : Root Space가 직접 참조하는 객체에만 Marking 한다. (STW 발생)
  2. Concurrent Mark : 1 에서 마킹한 객체가 참조하는 다른 객체들을 따라가며 마킹한다. (STW 발생안함)
  3. Remark : 2에서 변경된 과정을 한번 더 마킹하며 확정시킨다. (STW 발생)
  4. Current Sweep : Mark 하지 않은 객체 제거 (STW 발생안함)
  • Compact 를 지원하지 않는다
  • G1 GC가 나온뒤 Deprecated 되었다.

G1(Garbage First) GC

  • Heap을 Region이라는 단위로 나눈 뒤, Eden, Survivor, OG Region으로 나눈다.
  • Garbage만 남아있는 Region을 회수한다.
  • Runtime에서 필요에 따라 YG, OG 영역의 비율을 튜닝한다.
  • 자바 10 이후로 default GC이다.

장점

  • Garbage영역만 회수하기 때문에 GC의 빈도 줄어든다.
  • Compact 비용이 낮아진다.

단점

  • 공간 부족 상태를 조심해야한다. (Minor/Major GC를 하고도 공간이 부족한 경우 Full GC가 발생한다.)
    Full GC는 single thread로 동작한다.
  • Heap 영역의 공간이 작으면 비효율적이다.

ZGC

ZGC는 8MB부터 16TB까지의 힙 크기에서 STW가 10ms이하로 GC를 수행한다.

small - 2~4MB로 작은 객체를 할당한다.

mideum - 보통 8~16MB로 중간 크기의 객체를 할당한다.

large - 일반적으로 32MB정도 할당하며 하나의 객체만 저장한다.

자바 17부터 디폴트 GC로 사용된다.

  1. 초기화: ZGC는 힙을 초기화하고, 루트 객체를 식별하여 가비지 수집 작업을 수행하기 전에 참조되는 모든 객체를 식별한다.
  2. 참조 수집: ZGC는 모든 참조를 추적하여 현재 참조되지 않는 객체를 식별하고, 이들을 찾아내어 마크한다. 이 과정은 애플리케이션이 실행 중인 동안에도 수행된다.
  3. 복사: 마크된 객체는 새로운 메모리 공간으로 복사된다. 이 과정에서는 객체의 상태 정보를 이전하고, 참조 관계를 업데이트해야 한다.
  4. 갱신: 새로운 메모리 공간으로 복사된 객체는 원래 객체와 교체된다. 이 과정에서는 이전 객체의 메모리 공간이 해제되고, 새로운 객체의 참조 관계가 정리된다.
  5. Humongous 객체 처리: 특정 크기 이상의 객체가 있을 때 Humongous 객체 처리 방식을 사용한다. 이 방식은 이전 GC에서 사용되는 방식과는 다르게 처리된다.
  6. 정리: 객체의 메모리 공간이 해제되면, ZGC는 그 공간을 다시 재활용한다.

장점

  • STW시간이 10ms 이하로 매우 짧다.
  • 모든 메모리 크기의 (특히 대규모 메모리) 애플리케이션에서 유리하다.

단점

  • 일부 경우 성능 저하가 발생할 수 있다.

참고

https://steady-coding.tistory.com/590

https://d2.naver.com/helloworld/1329

https://stackoverflow.com/questions/70664562/criteria-for-default-garbage-collector-hotspot-jvm-11-17

우아한 테코톡


GC 튜닝이 알고싶다면

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

profile
봄은 영어로 스프링

0개의 댓글