Garbage Collector (Java)

김신영·2022년 9월 23일
0

java

목록 보기
1/1
post-thumbnail

Reference


Generational Hypothesis

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

    Most of the objects become unused quickly

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

    The ones that do not usually survive for a (very) long time

Memory Fragmentation

메모리 단편화 - 블로그

  • Internal Fragmentation
    - 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황

  • External Fragmentation
    - 메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다.
    - 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황

GC (Garbage Collector)

  • Runtime에 동적으로 Heap에 할당된 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능

Java 메모리 구조

Heap 메모리 구조

1. Young Generation

  • Eden 영역
  • Survivor 영역 (2개)
  1. 새로 생성한 대부분의 객체는 Eden 영역에 할당된다.
  2. Eden 영역에서 객체가 해제되는 것을 Minor GC 라고 한다.
  3. Eden 영역에서 GC가 한 번 발생한 후 살아남은 객체는 Suvivor영역 중 하나로 이동한다.
  4. 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다.
  5. 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다.

2. Old Generation

  • Old Generation 영역에서 메모리가 할당 해제되는 것을 Major GC 라고 한다.
    (Minor GC보다 속도가 느리다.)

3. Parmanent Generation (Method Area, Meta Space)

GC 관련 용어 정리

STW (Stop The World)

  • Java Application은 GC를 수행하는 Thread를 제외한 나머지 모든 Thread들은 GC가 완료될 때까지 멈추게 한다.
  • GC가 수행되는 동안 나머지 Thread들이 멈추는 현상을 말한다.

Mark and Sweep

  1. GC Root로부터 시작해 참조 사슬을 탐색하면서 참조 객체(Referent)들을 마크(Mark)한다. (Mark)
  2. 마크가 끝난 후, Heap 전체를 탐색하면서 마크되지 않은 객체들을 메모리 할당 해제한다. (Sweep)

GC Root Set

  • Java Stack
  • JNI Stack
  • Method Area (Parmanent Area)

Aging

  • Young Generation 영역에서 오래동안 살아남은 객체는 Old Generation 영역으로 옮겨지는데, 오래되었다고 판단되는 기준이 되는 값을 age라고 부른다.

  • 각 객체는 Minor GC에서 살아남은 횟수를 기록하는 age bit 를 가지고 있으며, Minor GC가 발생할 때마다 age bit 값은 1씩 증가 하게되며, age bit 값이 MaxTenuringThreshold 라는 설정값을 초과하게 되는 경우 Old Generation 영역을 객체가 이동된다.

  • 또는 Age bit가 MaxTenuringThreshold 초과하기 전이라도 Survivor 영역의 메모리가 부족할 경우에는 미리 Old Generation 으로 객체가 옮겨질 수도 있다.

  • 이 Minor GC과정에서 살아남은 객체들에게 age값을 증가시켜주는 단계를 aging이라고 한다.

Compact

  • Mark & Sweep 과정에서 Sweep 이후에 살아남은 객체들에 대해 메모리를 모아주는 과정을 말한다.

GC의 종류

  • Serial GC
    - 하나의 스레드로 Young 영역과 Old 영역을 연속적으로 처리하는 방식이다.

  • Parallel GC
    - Serial GC와 달리 Young 영역에서의 콜렉션을 병렬(Parallel)로 처리합니다.

  • Parallel Compacting GC
    - Parallel GC와 비교하여 Old 영역에 mark-summary-compact 알고리즘을 사용한다.
    - Old 영역으로 이동된 객체들 중 살아있는 객체를 식별한다.(Mark)
    - 전에 GC를 수행하여 Compaction 된 영역에 살아 있는 격체의 위치를 조사한다.(Summary)
    - Compaction 수행 이후에는 Compaction 영역과 비어있는 영역으로 나눈다.(Compact)

  • Concurrent Mark Sweep(CMS) GC
    - 애플리케이션 스레드와 GC 스레드를 동시에 수행하여 stop-the-world 시간을 최소화하는데 목적이 있다.

  • G1(Garbage First) GC
    - Java 7에 정식으로 등장하여 Java 9부터 default가 된 GC 방법이다.

  • Z Garbage Collectors (ZGC)
    - JDK11에 early access로 포함되어 15에 Production Ready 상태인 gc 방법이다.

  • Shenandoah GC

  • 참조
    - [블로그] GC(Garbage Collector)
    - [블로그] Java 의 GC는 어떻게 동작하나?

profile
Hello velog!

0개의 댓글