JVM Garbage Collection (GC) 핵심개념 알아보자

개발자 이상규·2023년 9월 6일

Java

목록 보기
1/6

GC란

JVM은 가비지 컬렉션을 통해 자동으로 메모리 할당 및 해제를 처리하며, 개발자가 명시적으로 메모리 관리를 하지 않아도 됩니다. 이를 통해 메모리 누수 및 다른 메모리 관련 오류를 방지하고 프로그램의 안정성을 향상시킵니다.

JVM의 Garbage Collection은 자동으로 수행되며 개발자가 직접 제어할 필요가 없습니다. 그러나 메모리 관리와 성능 튜닝을 위해 GC 로그 및 관련 도구를 사용하여 가비지 컬렉션 동작을 분석하는 것이 중요합니다. 또한 특정 애플리케이션의 요구 사항에 따라 GC 알고리즘을 선택하고 구성할 수 있습니다.

JVM Heap 메모리 구조

Heap 메모리: Java 애플리케이션에서 객체가 동적으로 할당되는 공간입니다. Heap 메모리는 크게 Young Generation과 Old Generation 두 부분으로 나뉩니다.

Young Generation(이하 YG): 새로 생성된 객체들이 할당되는 영역입니다. 이 영역에서는 빈번한 Minor GC(가비지 컬렉션)이 발생합니다. YG는 다시 Eden 영역과 두 개의 Survivor 영역(S0 및 S1)으로 나뉩니다.

Old Generation(이하 OG): YG에서 가비지 컬렉션을 여러 번 거치고 살아남은 객체들이 이동하는 영역입니다. 더 오랜 시간 동안 살아 있는 객체들이 저장됩니다. OG에서 Major GC(가비지 컬렉션)이 발생하게 된다면 Stop-the-world가 발생하게 됩니다.

Stop-the-world

GC를 실행하는 Thread를 제외한 모든 Application의 Thread가 GC 종료 전까지 일시정지 하게 됩니다. Application의 모든 Thread가 GC 종료 전까지 일시정지되기 때문에 튜닝을 해 이 시간을 단축합니다.

Stop-the-world 문제점

  • Full GC는 수 초 이상 진행되도 하면서 이 지연때문에 DB 연결이 끊기는 등 여러 문제가 발생할 가능성이 있습니다.
  • Full GC가 실행되는 동안 애플리케이션의 모든 스레드가 일시 중단됩니다. 따라서 Full GC가 수 초 동안 실행되면 애플리케이션의 응답 시간이 급격하게 느려질 수 있으며, 사용자 경험에 부정적인 영향을 미칩니다.

GC 동작과정

Minor GC

Minor GC는 주로 Young Generation라고 불리는 메모리 영역에서 수행되며, 새로 생성된 객체들을 관리합니다. Young Generation은 Eden 영역과 Survivor 영역(s0, s1)으로 나뉘며, 객체들은 처음에 Eden 영역에 할당되고, 일정 주기마다 살아남은 객체는 Survivor 영역(s0, s1)을 번갈아가며 이동하며 Compact 과정을 거치고 최종적으로 Old Generation으로 이동하게 됩니다.

작동 순서

  1. 객체 할당: 새로운 객체들은 Eden 영역에 할당됩니다.
  2. 참조 확인: 주기적으로 또는 Eden 영역이 가득 찰 때마다, JVM은 Eden 영역에 있는 모든 객체와 Survivor 영역에 있는 객체들의 참조를 확인합니다. Mark 과정에서 Reachable Object들은 계속 남게 되고, 더 이상 참조되지 않는 객체들은 Garbage로 판단하고 Sweep을 실시합니다.
  3. 복사: 이후 Eden 영역에 있는 유효한 객체들과 Survivor0의 유효한 객체들은 Survivor1 영역으로 복사됩니다(Compact를 진행하기 위해). 이 때, 유효한 객체는 Age가 증가하며, 일정 Age이상 증가한 객체는 Old Generation으로 이동합니다.

GC 알고리즘 (Mark & Sweep + Compact)

Mark: 더 이상 참조되지 않는 객체를 식별하고 표시합니다. (Reachable(유효함)과 Unreachable(유효하지 않음)을 근거로 대상 식별)
Sweep: 표시된 가비지 객체들을 실제로 메모리에서 제거합니다.
Compact: 메모리 공간을 최적화하고, Mark & Sweep 동작으로 객체가 제거되고 Slack(비어있는)된 공간을 최적화합니다.

GC 종류

Serial GC :
단일 스레드, 소규모 환경을 위한 간단한 GC

Parallel GC :
Java 8 기본 옵션, 멀티스레드 기반 작동, Low-pause (응용 프로그램 중단 최소화), Throughput(Mark & Compact 알고리즘 기반으로 신속성 최대화)

G1 GC (Gabage First GC) :

  • 4GB 이상 대용량 Heap 메모리를 사용하는 멀티스레드 기반 응용 프로그램에 특화된 GC
  • Heap을 영역 (1~32MB) 단위로 분할한 후 멀티스레드로 스캔

    G1 GC는 개념적으로 그들이 존재하나 일정 크기의 논리적 단위인 region으로 구분하고 있다.

  • 가비지가 가장 많은 영역부터 수집 실시
  • Java 9 부터는 기본 옵션





reference :

profile
Contact: leeeesanggyu@gmail.com

2개의 댓글

comment-user-thumbnail
2023년 9월 26일

사용되지 않는 객체들이 무분별하게 사용되지 않도록 습관을 들여야겠네요! 잘 읽고 갑니다.
다음에 GC 모니터링해서 튜닝하는것도 올려주세요 궁금해용

1개의 답글