ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JVM의 Garbage Collector 작동 방식
    Java 2021. 3. 7. 22:23

    목차

    • JVM과 Garbage Collection란
    • Garbage Collector의 과정
    • Garbage Collector는 언제 일어날까?

    JVM과 Garbage Collection란

    JVM은 운영체제의 메모리 영역에 접근하여 메모리 관리를 수행하는 프로그램입니다. JVM은 메모리 관리와 Garbage Collection을 수행합니다. 또한, 동적으로 할당된 메모리 영역 중 필요없는 부분을 해제하는 기능을 가지고 있습니다.

    Garbage Collection이란 이 JVM의 Heap 영역에서 사용하지 않는 데이터들을 제거하는 활동을 말합니다.

    Garbage Collector의 과정

    객체

    1. GC Roots에 있는 데이터들이 Heap 영역의 데이터를 참조하고 있는지 마킹
    2. 참조된 객체가 또 다른 객체를 참조하고 있는지 계속해서 마킹
    3. 참조되지 않은 값 제거

    1~2번의 과정을 마킹한다고 하여 mark, 3번의 값을 제거하는 과정을 sweep 이라고 하고 이러한 과정을 'mark & sweep 한다' 라고도 표현할 수 있습니다.

    GC Roots가 될 수 있는 조건으로는 stack 영역의 데이터이거나, method 영역의 static 데이터이거나, JNI에 의해 생성된 객체들이 해당됩니다.

    또한 참조되고 있는 객체를 Reachable, 참조되지 않은 객체를 Unreachable 하다고도 표현합니다

    Garbage Collector는 언제 일어날까?

    GC에서 Heap은 다양한 영역을 가지고 있습니다.

    GC Heap Area

    이 영역에서 각각의 영역이 모두 찰때마다 GC가 발생하게 됩니다. 이 영역을 크게 2가지로 나눠서 Young 영역(Young Generation), Old 영역(Old Generation)으로 나눌 수 있습니다.

    Young Generation

    Young 영역은 새롭게 생성한 객체가 저장되는 공간입니다. Young 영역에서 발생되는 GC는 Minor GC라고 부릅니다.

    Young 영역은 다음의 3가지 영역을 가지고 있습니다.

    • Eden 영역
    • Survivor 영역(2가지)

    이 영역에 대한 처리 순서는 대략 다음과 같습니다.

    1. 맨 처음에 생성한 객체는 Eden 영역에 할당
    2. Eden 영역에서 GC가 발생되면, 참조되고 있는 객체들은 Survivor로 이동(이때 이미 살아남은 객체가 있는 Survivor 영역으로 이동)
    3. Survivor 영역에서 값이 모두 차게 되면, 살아남은 객체들은 age값을 증가시키고 다른 Survivor 영역으로 이동
    4. 이 과정을 반복하다가 Survivor 영역에서 특정 age값이 넘는 값들은 Old 영역으로 이동

    이 과정을 통해 Survivor 영역 중 한곳은 반드시 비어있다는 것을 알 수 있습니다.

    Old Generation

    Old 영역은 Survivor 영역에서 특정 age값 횟수만큼 살아남은 객체들이 저장되게 됩니다. 이 영역에서는 Major GC가 수행됩니다.

    Major GC가 발생하면 GC를 수행하는 스레드를 제외한 나머지 스레드가 모두 멈추게 되는데, 이를 stop-the-world 라고 합니다. 보통 GC를 튜닝한다는 말은 이 stop-the-world 시간을 줄이는 것을 의미합니다.

    Young / Old 영역으로 나눈 이유?

    그렇다면 자바의 GC는 왜 Young / Old 영역 및 Minor GC / Major GC로 나뉘어져 있을까요? 그 이유는 weak generational hypothesis 라는 가설을 이해하면 알 수 있습니다.

    weak generational hypothesis

    대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다.

    오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.

    많은 객체들이 빠르게 없어지기 때문에, 그에 따라 Minor GC의 경우 자주 실행하는 것이 메모리 관리 측면에서 유리합니다. 반면의 Major GC의 경우 실행시에 많은 객체가 소모되지 않기 때문에 자주 실행이 될 필요가 없게 됩니다.

    링크

    우아한Tech 유튜브 - [10분 테코톡] 👌던의 JVM의 Garbage Collector
    우아한Tech 유튜브 - [10분 테코톡] 🐥엘리의 GC
    네이버 기술 블로그 - Java Garbage Collection

    댓글

Designed by Tistory.