[Java] Old GC와 New GC

소윤정·2022년 5월 29일
0

JAVA

목록 보기
15/15
post-thumbnail

가비지 컬렉션(Garbage Collection)

  • 자바 프로그래머는 직접 메모리 공간이 할당과 반환을 수행하는 대신 JVM을 통해 메모리를 할당 받는다. 더이상 사용되지 않는 메모리 공간은 JVM이 알아서 회수한 다음 해제해준다. JVM의 이런 메모리 해제 동작을 '가비지 컬렉션(Garbage Collection)'이라고 한다.
  • 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능을 한다.
    - Heap : 동적으로 할당한 메모리 영역
    • 모든 Object 타입의 데이터가 할당, Heap 영역의 Object를 가리키는 참조 변수가 Stack에 할당

가비지 컬렉션 과정

  • stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.
  • GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작
  • 어떤 GC 알고리즘을 사용하더라도 stop-the-world는 발생한다.
  • 대개의 경우 GC 튜닝이란 stop-the-world 시간을 줄이는 것
  1. Garbage Collector가 Stack의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
  2. Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.
    → 1번 2번을 마킹한다해서 "Mark"
  3. 마킹되지 않는 객체를 Heap에서 제거 → "Sweep"
    ⇒ 참조되는 객체를 마킹하고 그 외에 것들은 제거

언제 나타나는지?

  • New
    - 새로운 객체는 Eden 영역에 할당된다.
    - Eden 메모리가 전부 채워지게 될 경우 GC(Minor)이 발생하게 되고, Eden 영역의 Reachable 객체는 Survivor1으로 옮겨지게 된다.
    Eden 영역의 Unreachable 객체는 메모리에서 해제
    이러한 과정이 반복되고, Servivor1 영역이 꽉차면 Servivor1영역에 대해서 Mark and Sweep과정이 일어나게 된다.
    - Survivor1에서 살아남은 객체들은 Survival2 영역을 이동하고, 이동한 객체는 Age 값 증가
    Eden 영역에서 GC가 발생하게 되면 살아남은 객체는 Servival2로 이동시켜준다.
    결국, Survival 두 영역 중 하나의 영역은 비어있는 상태를 유지한다.
    - Survival2가 모두 가득 찼을 경우 Survival2 영역에 대해서는 Mark and Sweep가 일어나게 되고 Survival2 영역에 있던 객체는 Survivor1 영역으로 이동하고, 이동한 객체는 Age 값 증가
  • Old
    - Old 영역은 Young 영역보다 크게 할당하며, 이러한 이유로 Old 영역의 GC는 Young 영역보다 적게 발생한다.
    - Old generation이 가득 차게 될 경우 Major Garbage Collector 발생하게 된다.
    👉 이러한 과정이 반복되면서 GC가 메모리 관리를 하게 된다.

0개의 댓글

관련 채용 정보