[Java] Garbage Collection

이대건·2024년 1월 31일

Java

목록 보기
6/17
post-thumbnail

자바의 heap을 관리해주는 Garbage Collector에 대해 알아보자

JVM 구조

  • GC를 알아보기 위해 실행되는 환경인 JVM의 구조먼저 알아보야야한다.
  • 메인이 되는 구성요소
    • class loader
    • runtime data area
    • execution engine
  • 성능에 직접적인 연관이 있는 구성요소
    • heap

      • 객체 데이터가 존재한는 영역
      • GC가 관리하는 영역
    • Garbage Collector

      • heap을 관리
    • JIT compiler(Just-In-Time)

      • 런타임시 자바의 바이트코드를 원시코드로 컴파일하여 JAVA 어플리케이션의 성능을 향상

Automatic Garbage Collection?

작업 개요

  1. 사용하는 객체와 사용하지 않는 객체 구분
    a. 사용중: 프로그램에서 객체가 referenced인 상태
    b. 사용중이 아닌것: 프로그램 내부에서 전혀 reference되지 않은 상태
  2. 사용하지 않는 객체를 반환

실제 작업

  1. marking
  • heap영역에서 사용중인 객체와 아닌 객체를 구분하는 작업
  1. Normal Deletion
  • 사용중이지 않은 객체 제거
  • Memory allocator가 객체가 제거된 빈 공간을 유지

2a. Deletion with Compacting

  • 성능 향상을 위해 사용중인 heap을 compact하게 만든다

왜 GC를 사용하는가?

  • 경험적 분석에 의하면 할당된 객체는 시간이 지날수록 사용되지 않는 통계가 있기 떄문
    • 다크모드 꺼야 표가 제대로 보입니다
  • 아래 표를 보면 minor GC와 major GC가 있다.

언제 GC가 사용되는가?

  • 이 정보를 기반으로 heap을 나누면 다음과 같다.
  1. young generation
    a. 새로운 객체가 할당되는 영역
    b. 이 영역이 가득 차면 minor GC 실행되며 이 영역이 관리됨
    c. minor GC이후에도 살아있는 객체는 old generation으로 이동
  2. old generation
    a. 오랫동안 사용된 객체를 저장하는 공간
    b. 이 영역이 수거되는 작업이 major GC다.
  3. permanent generation
    a.메타데이터 저장장소

stop the world

a. 모든 minor GC와 major GC는 모든 어플리케이션 스레드를 중단하는 "Stop the world"이다.
b. major GC에는 사용중인 객체도 포함되어있기에 더 오래걸린다.
c. 반응형 앱에서는 major GC를 최소화 해야함

출처

Java GC 오라클 공식문서

profile
일낸머스크

0개의 댓글