GC

한상우·2023년 5월 31일
0

java

목록 보기
16/16

GC

Garbage Collector

가비지 컬랙터는 무엇이고 작동원리는?

C언어는 메모리 할당과 해제를 직접 해줘야 했는데, 해지를 까먹으면 유효하지 않은 메모리가 점점 쌓이게 된다

garbage collection

  • JVM - Execution Engine에 Garbage Collector가 존재
  • 더 이상 참조되지 않는 메모리 객체를 모아, 제거하는 역할을 수행

Garbage??

  • 앞으로 사용되지 않는 객체의 메모리

GC란

  • 자바의 메모리 관리 기법, 애플리케이션이 동적으로 할당했던 메모리 영역 중 더이상 사용하지 않는 영역을 정리하는 기능

  • Stop The World: GC를 수행하기 위해 JVM이 멈추는 현상, GC관련 쓰레드를 제외한 모든 쓰레드는 멈춤

    일반적으로 GC 튜닝이라는 것은 멈추는 시간을 최소화 하는 것

GC 원리

JVM 힙 영역이 만들어 질 때 전제

가정 1. 대부분의 객체는 금방 접근 불가능한 상태가 된다

가정 2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 발생

→ 객체는 대부분 일회성, 메모리에 오래 남아있는 경우는 드물다

객체의 생존 기간에 따라 Young Old 2가지 영역이 생성

Young

  • 새롭게 생성된 객체가 할당되는 영역
  • Young에 대한 GC를 Minor GC 라 한다

Old

  • Young 영역에서 살아남은 객체가 복사
  • Old 에 대한 GC를 Major GC라 한다

Old 영역의 공간이 더 큰 이유

  • 수명이 짧은 객체들은 큰 공간이 필요 X
  • 큰 객체들은 바로 Old 영역에 할당됨

이때, Old 영역에 있는 객체가 Young 영역에 있는 객체를 참조하는 경우도 있을 수 있다.

Minor GC가 참조 여부를 확인할 때 모든 Old 영역을 검사하지 않게 하기 위해 Card Table이라는 걸 도입

카드 테이블만 조회하여 GC 대상인지 확인

GC 동작원리

Minor GC, Major GC 둘 다 가비지 컬렉션이 실행된다면 2가지 공통 단계를 거친다

  1. Stop The World
  2. Mark and Sweep

Stop The World

  • GC를 수행하기 위해 GC를 수행하는 쓰레드를 제외한 모든 쓰레드의 작업 중단
  • JVM이 애플리케이션 실행을 멈춤
  • GC 튜님: Stop The World의 시간을 줄이는 작업

Mark and Sweep

  • Mark: 사용되는 메모리와 사용되지 않는 메모리를 식별
  • Sweep: 사용되지 않는 메모리로 식별된 메모리를 해제
  1. Stop The World를 통해 작업을 중단시킴
  2. GC가 스택의 모든 변수들을 돌면서 어떤 객체를 참고하는지 확인 - Mark
  3. 마크 되지 않은 객체 지우기 - Sweep

Minor GC

Young영역은 1개의 Eden 영역 + 2개의 Survivor 영역으로 나눠짐

Eden: 새로 생성된 객체가 할당되는 영역

Survivor: 최소 한 번의 GC를 살아남은 객체가 존재

  1. 객체가 새로 생성되면 Eden 영역에 할당
  2. Eden 영역이 꽉 차면 Minor GC 수행
  3. 사용되지 않은 메모리 해재, 존재하는 객체는 Survivor로 이동
  4. 1 ~ 3 반복 하다 Survivor 가득 차면 비어있는 Survivor로 이동
  5. 이 과정을 계속 살아남은 객체는 Old 영역으로 이동

Major GC

Minor GC 과정을 거쳐 이동된 객체로 인해 Old 영역에 메모리가 부족해지면 발생

삭제 되어야 하는 객체를 mark하고 지운다. 메모리가 단편화 되어 있는 상태이므로 이를 한 군데에 모아준다.

일반적으로 young 영역은 작기 때문에 GC가 빨리 끝나 애플리케이션에 영향 많이 안줌

but, Major GC는 Young 영역을 참조할 수 있고 크기도 커서 시간이 오래 걸림

profile
안녕하세요 ^^

0개의 댓글