본문 바로가기
JAVA

Garbage Collector

by orioncsy 2023. 3. 5.

Garbage Collector

GC

개념

  • JVM에서 유효하지 않은 메모리를 정리하는 역할
  • 자바에서는 직접 메모리를 해제할 수 없기 때문에 GC를 사용

JVM HEAP

  • JVM에서 heap 영역에는 초기에 크게 2가지 영역으로 구분

Young 역역

  • 새롭게 형성되는 객체가 할당된다.
  • 주로 자주 사용하고 버려지는 일회성 데이터가 저장되는 곳으로 크기가 작다.
  • 크기가 작은 만큼 GC 실행 시간이 짧다. 이러한 이유로 이곳에서 실행되는 GC를 Minor GC로 표현
  • young에는 다시 eden, survivor0, survivor1이 존재한다.
    • GC를 실행해서 살아남은 데이터가 다음 영역으로 넘어간다.

Old 영역

  • young 영역에서 GC를 실행하여 살아남은 데이터가 복사되는 곳이다.
  • 데이터가 크거나 오랫동안 살아남은 데이터가 존재하여 크기가 크고 GC는 적게 발생된다.
    • 이러한 이유로 old영역에서 실행되는 GC를 Major GC로 표현

Card table

  • 예외적으로 old 영역의 객체가 young 영역의 객체를 참조하는 경우를 대비해 old 영역에 512 Bytes 덩어리로 된 테이블 존재
  • 카드 테이블에 old 영역이 young 영역을 참조하는 경우 정보를 저장
  • young 영역에서 GC를 실행할 때 모든 old 영역을 검사하면 비효율적이라서 카드테이블을 참조하여 GC 대상인지 판별

동작 방식

Stop The World

  • GC를 실행하는 스레드를 제외한 모든 애플리케이션 실행을 정지하는 과정

Mark and Sweep

  • 참조할 수 있는 메모리를 mark하고 mark 되지 않은 메모리를 제거하는 sweep 과정

GC 종류

Serial GC

  • minor GC의 경우 STW와 mark and sweep이 실행되고 major GC의 경우 compact 알고리즘 추가 실행
  • compact는 사용하고 있는 메모리의 빈 공간을 채우는 알고리즘
  • 단일 스레드로 동작

parallel GC

  • serial GC를 멀티 스레드를 사용하여 병렬로 처리

CMS(Concurrent Mark and Sweep) GC

  • parallel GC처럼 멀티 스레드로 동작하지만 여러 번 나뉘어서 GC 실행
  • 초반에 STW를 통해 GC를 실행하여 mark를 진행하고 다시 애플리케이션을 구동
  • 애플리케이션 구동 도중에 다시 GC를 실행하여 mark를 진행
  • 다시 STW를 통해 애플리케이션을 멈추고 새로 참조된 메모리를 mark 하고 sweep

G1(Garbage first) GC

  • java 9 버전 이후부터 기본 GC로 채택
  • 물리적으로 young, old 영역을 나누지 않고 region을 통해 힙 메모리를 균등하게 나누어 관리
  • 가비지가 많은 region 부터 GC 실행
  • 각 지역을 eden, survivor, old인지 논리적으로 구분
  • humongous(region 크기 50% 이상 객체를 저장하는 영역), available/unused(사용되지 않은 region) 존재
  • old GC의 경우 concurrent 방식으로 GC 진행

Reference

https://mangkyu.tistory.com/118

https://mangkyu.tistory.com/119

'JAVA' 카테고리의 다른 글

추상 클래스와 인터페이스  (0) 2023.03.12
접근 제어자  (0) 2023.03.10
JDK 변화  (0) 2023.03.09
Exception  (0) 2022.12.21
Java 버전 및 JDK 버전  (0) 2022.12.13