GC

HyeBin, Park·2022년 5월 24일
0

Garbage Collector 후아유

  • 더이상 사용하지 않는 메모리 영역자동으로 회수해준다.
    -> Garbage Collection
  • 이 아이가 있어 java는 managed language
  • Like 청소를 못하는 주방장의 조리대를 치워주는 똑똑한 조수 요기

🗻 Garbage Collection

Garbage Collection은 ?

  • 메모리 관리 기법 중 하나로 프로그램이 동적으로 할당했던 메모리 영역 중에서 사용하지 않게된 메모리 영역을 자동으로 회수하는 기능
  • 장점
    • 개발자가 메모리 할당 및 할당 해제에 대해 걱정하지 않아도 된다.
    • 이미 해제된 메모리에 접근하거나 다시 해제를 하는 버그를 줄일 수 있다.
    • 메모리 누수 멈춰 !
  • 단점
    • 해제할 메모리를 결정하는데 사용하는 알고리즘에 의해 비용이 든다
    • GC가 언제 일어날지 예측하기 어렵다 !
      -> System.gc 를 사용해도 바로 실행되는 것이 아님 사용하면 안 됨

🛬 Stop the world

  • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
  • GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈추고, GC 작업을 완료한 이후에야 작업을 다시 시작한다.

🚩 HEAP 메모리

  • Young - 모든 새로운 객체가 할당되는 곳, 마이너 GC
    • eden : 초기에 메모리가 할당되는 곳
    • survivor : eden에서 Galbage Collection에 살아남은 개체
  • Old - 일정 시간 동안 존재했던 객체 (많이 살아 남았다)
    • 메이저 GC
  • Permanent - 클래스의 메타데이터, 메서드의 메타데이터, 상수풀, static 변수 등 JVM의 반영 데이터를 포함하는 풀, 객체가 영원히 남아있는 곳이 아님
    => 자바 8 에서 사라지고 Native Memory 영역에 metaspace가 추가됨
    관련 내용

🚢 GC의 종류

마이너 GC

  • Young Generation 영역의 객체중 미사용으로 판단되는 객체 GC

메이저 GC

  • Old 영역으로 옮겨진 객체중 미사용으로 판단되는 객체 GC
  • Old는 메모리 할당률이 낮기 때문에 GC가 일어나는 빈도가 적다
  • Young에 비해 용량이 크고 객체 수도 많아 Stop the World 시간이 길다.

🤸‍♂️ 객체 GC 과정

1. 객체가 생성 되어 Eden 영역에 올라간다.

  • 이후 Eden 영역이 가득차면 마이너 GC가 발생한다.
  • 할당이 해제되지 않은 객체를 Servivor1 영역으로 이동

2. Servivor 영역으로

  • Survivor1 영역이 또 가득차면 GC 심사를 받고 살아남으면 Servivor2 영역으로 이동
  • Servivor2가 가득차면 GC 심사 후 Old로 이동
  • Servivor 영역중 하나는 반드시 비어있어야한다.
    -> 두 영역에 모두 데이터가 존재하거나 사용량이 0이라면 비정상

2-1. Servivor 영역보다 큰 객체라면 ?

3. 오랫동안 살아 남으면 Old 영역으로 이동

🚛 GC의 종류 (feat.애플리케이션에서 사용가능한)

Serial GC

  • CPU 성능이 낮을 때 유용하고 하나의 스레드만 사용
  • 마이너 GC : mark-sweep-compact
  • 메이저 GC : mark-sweep-compact
    • 살아있는 객체를 식별하고(Mark), Old영역의 가장 앞부분 부터 살아 있는 것만 남기고 삭제하며(Sweep), 마지막으로 살아있는 객체들을 가장 앞쪽으로 모아준다.(Compact) 
    • 느리다. 자원이 부족할 때 사용

Parallel GC

  • 시스템에 있는 CPU 코어의 수 만큼 스레드를 만들어 마이너 GC에 이용하는 것을 제외하고 Serial과 동일 -> 메이저 GC에서는 한 개의 스레드만 사용
  • 마이너 GC : Parallel Scavenge
  • 메이저 GC : Serial Mark-Sweep-Compact

Parallel Old GC

  • 메이저와 마이너에서 모두 여러 개의 스레드를 사용하는 것을 제외하고 Parallel GC 동일

Concurrent Mark Sweep Collector

  • GC 작업과 애플리케이션이 사용하는 스레드를 동시에 수행하여 STW에 의한 애플리케이션 중지 상태를 최소화한다.
  • 마이너 GC 영역에서는 Parallel GC 와 같은 알고리즘을사용
  • STW 에 의해 일어나는 일시정지를 포함한 평균 응답 시간을 줄일때 사용
  • 마이너 GC : Parallel Scavenge
  • 메이저 GC : Concurrent Mark-Sweep

G1 GC

  • CMS collector를 대체하는 것이 목표
  • 병렬성, 동시성, 적은 STW를 가짐
  • Young 영역과 Old 영역이 없고 힙 공간을 여러 개의 동일한 사이즈의 힙 공간을 분리함 -> 이 공간을 region이라 부름
  • GC가 호출되면 refion 중에 liveness가 가장 적은 곳이 GC 됨
  • 자료

Reference

0개의 댓글