F-lab 챌린지 53일차

성수데브리·2023년 8월 19일
0

f-lab_java

목록 보기
43/73

GC

  • JVM 은 OS 를 이용해 동적으로 메모리 관리를 하지 않고, JVM 에 할당된 연속된 단일 메모리 풀을 관리한다.
  • JVM 은 메모리를 GC 라는 알고리즘으로 관리한다.
  • GC 가 어플리케이션의 성능에 영향을 미칠때
    • GC 발생
    • GC 발생시 각 영역에서 다른 영역으로 이동할 때 병목현상 발생
    • full GC 를 수행하는 시점에는 해당 JVM 에서 처리되지 않기 때문에 GC가 자주 수행되면 응답 시간에 많은 영향을 끼친다. → 상황에 맞는 GC 알고리즘이 선택이 중요하다.
  • 가비지 콜렉터의 역할
    1. 메모리 할당

    2. 사용중인 메모리 인식

    3. 사용하지 않는 메모리 인식

      이 작업을 안하면 무슨일이 발생할까?

      1. 메모리 영역이 꽉차서 hang 발생 가능
      2. 메모리가 부족할때마다 계속 늘리다가 한계에 도달하면 OOME 발생하여 JVM 이 다운될 수 있음
  • GC는 Deamon Thread 에서 수행된다. (백그라운드 스레드에서 수행된다)
    자바는 시스템 콜을 하지 않는다.

GC 가 일어나는 주된 원인

  1. 할당률
    • 정의 : 일정 기간 새로 생성된 객체가 사용한 메모리량
  2. 객체 수명

→ GC 알고리즘의 트레이드오프가 이 두 요인과 직결되어있다.

약한 세대별 가설 (Weak Generational Hypothesis)

JVM 및 유사 소프트웨어 시스템에서 객체 수명은 이원적(bimodal) 분포 양상을 보인다.
거의 대부분 객체는 아주 짧은 시간만 살아있지만, 나머지 객체는 기대 수명이 훨씬 길다.

  • 이 이론에 근거하여 GC 연구자들은 는 짧은 시간 살아있는 객체를 빠르고 쉽게 수집하고,
    오래 사는 객체는 빨리 죽는 객체와 완전히 분리하는게 가장 좋다는 결론에 이르렀다.
    - heap 영역 구분 : young Generation & old generation
    - Young 영역
    - Eden
    - Survivor1
    - Survivor2
    - Old 영역
        !https://miro.medium.com/v2/resize:fit:1400/format:webp/1*XXqPGJCxQfri7qE_GrSB8Q.png
        
    - GC 종류 Minor GC & Major GC
        - Minor GC : 영 세대에서 발생하는 GC
        - Major GC : 올드 세대에서 발생하는 GC
  • 객체마다 generational count(통과한 GC 횟수)를 센다.
  • 카운트를 기반으로 오래 살아남았다 보는 객체는 old 또는 tenured 세대에 보관한다.
  • 외부에서 young 세대 내부를 가리키는 포인터를 계속 추적함으로써 mark 단계에서 GC ROOT 부터 객체 그래프 탐색을 반복하지 않아도 된다. Mark and Sweep, Compaction

Mark and Sweep, Compaction

  • 가비지 콜렉터는 매시간마다 더이상 참조되지 않는 객체를 찾아내 메모리에서 삭제한다.
    이 확보된 공간은 새로운 객체 할당에 사용된다.
  • GC 의 기본 알고리즘이다

!https://miro.medium.com/v2/resize:fit:1400/1*j8EdlKY3a1zJInwzLdWvNg.png

Mark

  • 정의 : 살아있는 객체를 식별하는 것
  • 내부 동작
    • GC 루트부터 살아있는 객체(live objects)를 찾아 표시(mark bit)한다.
  • live objects 탐색 방법
    • 객체 참조값은 그래프 형태로 참조된다. (live object graph)
    • 그래프 자료구조에서 루프 노드가 되는 곳이 GC root 라고 보면 된다.
      GC root 에서부터 DFS 방식으로 탐색하며 객체에 mark bit 표시를 하는 것이다.
  • GC ROOT

Sweep

  • 고아객체를 메모리에서 할당 해제하는 것
  • mark bit 표시 안된 객체를 찾는다.
    • heap 영역에서 메모리를 회수해 free list 에 되돌린다.
    • 객체를 삭제한다.

Compaction

살아있는 객체를 다른 survivor 영역에 옮기면서 연속된 공간에 할당한다.

GC 발생 시점?

  • 메모리 할당 요청을 수용하기에 메모리가 부족할때 작동하여 필요한 만큼 메모리를 공급한다.
  • 고정된 시간 간격으로 발생하는게 아니라 그때그때 필요에 의해 발생한다.

GC 알고리즘

1. Serial GC

  • 단순 mark-sweep-compact 알고리즘 사용 & Minor GC & Major GC 를 사용한다.
  • 하나의 CPU 를 사용한다.
  • 적은 메모리와 낮은 CPU 를 사용하는 클라이언트 머신 어플리케이션에 적합하다.
  • 대기 시간이 많아도 크게 문제되지 않는 시스템에 적합

2. Parallel GC

  • throughput collector 로도 알려진 방식
  • 목표 : 다른 CPU 가 대기 상태로 남아 있는 것을 최소화 하는 것
  • Young 영역에서 GC 를 병렬로 처리한다.
  • 많은 CPU 를 사용하기 때문에 GC의 부하를 줄이고 애플리케이션의 처리량 증가시킬 수 있다.
  • mark-sweep-compact 알고리즘 사용
  • 객체를 방출하는 반구형 수집기

3. Parallel Old GC (병렬 콤팩팅 콜렉터)

  • Old 영역에서 GC 를 병렬로 처리한다.
  • 하나의 연속된 메모리 공간에서 압착하는 수집기다.

4. Concurrent Mark Sweep

Garbage Collection Algorithms: Concurrent Mark Sweep, Fragmentation and Compaction, Lost Writes

  • 2개 이상의 프로세서를 사용하는 서버에 적당하다. ex) 웹 서버
  • CPU 가 많지 않고 시스템의 대기 시간이 짧아야 할 때 사용하면 좋다.

0개의 댓글