[Java] GC (가비지 컬렉션)

JMG·2024년 1월 4일

0. GC란 무엇인가?

Garbage Collection: Garbage Collector가 수행하는 메모리 정리 프로세스

  • Garbage Collector: JVM에 있는 메모리 관리를 담당하는 시스템

Java 플랫폼의 3대 요소

자바 플랫폼에는 Java SE, Java EE, Java ME가 있고 해당 플랫폼들의 구성 요소는 아래와 같다.

  • JDK(Java Development Kit): 자바 개발 키트
    자바 개발에 필요한 소프트웨어 키트
    개발에 필요한 도구(개발툴), 라이브러리, 컴파일러(javac)와 JRE가 포함되어 있음
  • JRE(Java Runtime Environment): 자바 런타임 환경
    자바 어플리케이션 실행 환경에 필요한 구성 요소들이 포함된 소프트웨어 패키지
    클래스 라이브러리, 클래스로더와 JVM으로 구성됨
  • JVM(Java Virtual Machine): 자바 가상 머신
    OS에 상관없이 자바 바이트코드(.class)를 실행시키기 위한 가상 머신
    실행에 필요한 클래스로더, 메모리, 엔진 등으로 구성되어 있음

JVM

JVM 종류마다 구성이 완전히 동일하지 않지만 일반적으로 아래와 같이 JVM이 구성되어 있다.

1. 무엇을 GC 하는걸까?

Runtime Data Area

GC의 대상인 Runtime Data Area(JVM에서 사용하는 메모리)에 대해 알아보자.

1) Method Area: 클래스와 인터페이스에 대한 정보 저장
2) Heap: 객체와 배열을 저장

  • 동적으로 할당된 객체나 배열을 저장하는 Heap 영역은 GC의 대상이다.
  • Method Area와 Heap은 스레드들이 공통으로 사용하는 영역이다.
    3) JVM Language Stacks: 호출한 메소드에 대한 정보 저장
    4) PC Registers
    5) Native Method Stacks

Heap 영역 구성

Heap 영역은 여러 영역으로 구성되어 있다.
1. Generational Garbage Collection

  • Young과 Old로 영역을 구분하는 이유는 대부분의 객체의 수명은 길지 않으므로 수명이 짧은 객체들을 주기적으로 수집하기 위해 구분.

Reachability

가비지 컬렉터가 어떤 객체를 메모리에서 제거할지 결정하는데 사용
객체가 Stack이나 Method Area과 직간접적으로 연결(참조)되어있으면 GC 대상에서 제외됨

public class Main {
	public static void main(String[] args) {
		int num = 3;
		String name = "안";
		Person p = new Person();
		name += "녕";
    }
}

1) 위의 코드 중 num, name, p와 num의 값이 stack에 들어가고, name의 값과 p의 객체가 heap에 들어가서 name, p가 해당 배열과 객체를 참조하게됨.

  • GC를 수행하면 Stack과 직간접적으로 연결되지 않은 1개의 String 객체만 삭제됨

    2) main 함수가 끝나게 되면 stack에 들어있던 num, name 등은 삭제되고 heap에 들어있는 배열과 객체는 남아있게됨
  • GC를 수행하면 Heap 내의 3개 객체 모두 삭제됨
  • 참고: https://gitsu.tistory.com/34

2. 어떻게 GC 하는걸까?

Garbage Collector 종류

GC 종류는 아래 사이트에 잘 설명이 되어있어 참고하였다.

  1. Serial GC
  • 단일 CPU를 사용하여 GC를 수행하므로 Stop The World가 긺
  • Heap 영역 구분: Young, Old
  • Mark-Sweep-Compact 알고리즘 사용
  • 임베디드 시스템에서 주로 사용
  1. Parallel GC
  • 여러 CPU를 사용하여 Miner GC를 수행하나 Old 영역의 Major GC는 단일 CPU로 수행
  • Heap 영역 구분: Young, Old
  • Serial GC와 알고리즘은 동일(Mark-Sweep-Compact)하나 멀티스레드로 병렬 수행
  • 배치나 대량 쿼리에 주로 사용
  1. Parallel Compacting GC
  • 2번과 동일하며 Old 영역도 멀티 스레드로 수행
  1. CMS(Concurrent Mark-Sweep) GC
  • 여러 CPU를 사용하여 GC를 수행하며 Parallel GC와 차이점은 CMS GC는 마킹 단계(1단계) 수행 시에만 STW(Stop The World)가 발생한다.
  • Heap 영역 구분:
  • Concurrent Mark-Sweep 알고리즘 사용
  • 메모리 단편화 문제(메모리는 충분하지만 작은 메모리 공간만 존재해서 크기가 큰 객체가 들어갈 공간이 없는 문제)로 인해 더 이상 사용되지 않음
  1. G1GC
  • G1의 뜻은 Garbage First이며 사용하지 않는 객체가 가장 많은 영역부터 정리함
  • Heap 영역 구분: 크기가 일정한 region으로 되어있으며, 각 영역(region) 마다 generation(Eden, Survivor, Old)이 존재함

  • Humongous regin: Eden이나 Survivor에 할당하기엔 너무 큰 객체(region 크기의 50% 이상인 객체)를 메모리에 넣기위해 사용
    • Young, Old에 속해있지 않고 별도 관리됨
  • G1GC는 마킹 시 SATB(Snapshot-At-The-Beginning) 알고리즘을 사용
  1. Epsilon GC
  • 테스트 목적으로 사용하는 GC로 메모리 정리를 수행하지 않음
  1. ZGC

  2. Shenandoah GC

GC 과정

  1. Minor GC: Yong Generation에서 수행
  • 최초 객체나 배열 생성 시 eden에 들어감
  • Minor GC 수행 시 Eden이나 Survivor에서 살아남은 객체나 배열은 크기가 Survivor보다 크지 않다면 Survivor 영역으로 들어감
    • Survivor 영역은 한 곳에만 객체가 있으며 S0에 객체가 있을 경우 S0에 객체를 더이상 넣을 수 없다면 S1으로 객체를 이동시킵니다.
  • 위 과정들을 반복하여 일정 score 이상이 되면 Old Generation으로 객체가 이동됩니다.
  1. Major GC: Old Generation에서 수행
  • Old Generation의 미사용 객체들을 효율적으로 제거하기 GC 수행과정에서 어플리케이션을 잠시 멈추게 됩니다. (Stop The World)

GC 알고리즘

  1. Mark-Sweep-Compact
    아래 블로그에 동작 과정이 아주 잘 정리된 이미지가 있어서 가져왔다.

동작 과정
1) Mark: root를 기준으로 직간접적으로 참조 상태인 Reachable 객체를 마킹
2) Sweep: 마킹이 되지 않은 Unreachable 객체를 메모리에서 정리
3) Compact: 마킹된 객체들을 압축

  1. Concurrent Mark-Sweep

1) Initial Mark: 살아있는 객체를 찾아 마크만 합니다. 이때 Stop the world 현상이 발생하지만 모든 객체를 스캔하지 않고 살아있는 객체의 그래프를 탐색하기 때문에 짧은 시간 멈추게 됩니다.
2) Concurrent Mark: 1번에서 찾은 객체들을 따라가며 모두 살아있는지 확인합니다. 이때 애플리케이션을 멈추지 않으며 GC와 애플리케이션의 리소스를 공유합니다.
3) Remark: 2번에서 새로 생긴 객체나 참조가 끊긴 객체를 탐지합니다. 이때는 Stop the world 현상이 발생합니다.
4) Concurrent Sweep: 마크한 객체들을 Sweep하는 작업을 거칩니다. 이때는 Stop the world 현상이 발생하지 않습니다.

  • Compact 작업을 수행하지 않으므로 조각화의 문제가 있어서 현재는 미사용

GC를 하는 이유가 무엇인가?

반응성(요청에 대한 더 빠른 응답)이나 처리량(특정 시간동안 더 많이 처리)을 개선하기 위해서 튜닝을 수행

  • 위와 같이 보라색 네모가 자바 성능에 영향을 미치는 부분이다.

참고하기 좋은 사이트들

profile
DIY Coding

0개의 댓글