Garbage Collection

2025. 3. 20. 21:47·CS 스터디/CS - JAVA

1. GC의 정의


Garbage Collection (GC)은 자바를 비롯한 대부분의 프로그래밍 언어에서 제공하는 자동 메모리 관리 프로세스입니다.

GC는 주로 힙 영역의 메모리 중 더 이상 참조되지 않는 메모리를 자동으로 탐지 및 회수하여 프로그램이 효율적으로 실행될 수 있도록 도와줍니다.

 

2. Garbage Collection이 필요한 이유


GC는 메모리 누수문제를 방지하고, 프로그램의 안정성을 향상시키고, 자원의 효율적인 관리를 가능하게 합니다.

메모리 누수문제 방지 / 효율적인 자원 관리

메모리 누수는 프로그램이 동작 중에 더 이상 사용하지 않는 메모리를 반환하지 않고, 계속해서 할당된 상태로 남아있는 현상을 말합니다.

만약 GC가 없다면, 사용하지 않는 객체들이 계속해서 메모리를 차지하게 되어, 시스템의 메모리가 부족해질 수 있습니다. 수동으로 객체의 메모리를 해제할 수 있지만, GC는 이런 불편한 일련의 과정들을 자동으로 처리하여 자원을 효율적으로 관리합니다.

 

프로그램의 안정성 향상

개발자가 메모리를 수동을 관리하지 않기 때문에 프로그램의 안정성이 향상됩니다. 만약, 객체를 해제할 시점을 실수로 놓치거나 잘못된 시점에 해제할 경우 예기치 않은 오류가 발생할 수 있지만, GC가 메모리 해제를 자동으로 처리함으로써, 개발자는 이런 문제를 걱정하지 않아도 됩니다.

 

멀티스레드 환경의 안정성 보장

멀티스레딩 환경에서는 여러 스레드가 동시에 객체를 참조하고 수정할 수 있기 때문에, 동기화 문제가 발생할 수 있습니다.

GC는 Stop-the-World를 활용하여 모든 어플리케이션의 스레드를 멈추고, 안전하게 메모리를 해제합니다.

 

3. Garbage Collection의 프로세스


GC는 객체의 참조 여부를 기반으로 메모리에서 객체를 제거하는 방식으로 동작합니다.

기본적으로 객체가 더 이상 참조되지 않으면, 그 객체는 쓰레기(Garbage)로 간주되고 메모리에서 해제됩니다.

GC가 동작하는 동안에는 JVM이 GC와 관련없는 모든 스레드의 동작을 멈추도록 하는데, 이걸 'Stop-the-World'라고 합니다.

더보기
💡Stop-the-World
GC가 실행되는 동안 애플리케이션의 모든 쓰레드가 일시적으로 멈추게 되는 현상
해당 과정이 존재하는 이유는, GC가 시스템 리소스를 독점하여, 메모리 정리나 객체 추적을 완벽하게 할 수 있도록 보장하기 위함
성능 최적화의 중요한 고려사항

먼저 JAVA에서 GC의 핵심 동작을 살펴보겠습니다.


JAVA의 GC  동작 순서

핵심 알고리즘 : 마크(Mark) & 스위프(Sweep)

1. 마크

  • GC 루트 객체를 기준으로 연결된 객체들을 추적하여, 참조되는 객체를 마크

2. 스위프

  • 마킹되지 않은 객체를 힙에서 제거하여 메모리를 해제
  • 해당 과정으로 ‘메모리 단편화’가 발생할 수 있음

3. 컴팩션 (선택적)

  • 살아남은 객체를 힙의 한 쪽으로 이동시키고, 이동된 객체의 참조를 업데이트
  • 일부 GC 알고리즘에서 단편화된 메모리를 정리하여 연속된 공간으로 만듬

 

JAVA의 GC 세부동작

GC가 동작하는 동안 실행 중인 스레드가 멈추는 Stop-the-World 현상이 발생하기 때문에, GC가 모든 객체를 마크&스위프(Mark & Sweep) 방식으로 처리하고, 컴팩션(Compaction)까지 수행하는 것은 매우 비효율적입니다. 이를 해결하기 위해 자바의 힙 영역은 Young Generation, Old Generation 으로 나뉩니다. 이러한 구분은 GC가 조건에 따라 최적화된 성능을 발휘할 수 있도록 하여, 성능을 향상시키고 GC 효율성을 높이는 데 도움을 줍니다.

 

GC는 객체의 생성과 소멸 주기를 기준으로 Young Generation과 Old Generation으로 나누어 메모리를 관리합니다. 이 구조를 통해 각 영역에 적합한 방식으로 GC가 동작하도록 최적화됩니다. 해당 구조를 더 잘 이해하기위해 힙 영역에 대한 그림과 함께 설명을 덧붙이겠습니다.

 

힙 영역의 구성

힙 영역에서의 GC의 동작과정

  1. 새로운 객체가 생성되면 Eden영역에 저장됩니다.
  2. Eden영역의 메모리가 꽉 차면, Minor GC가 발생하여 참조되지 않는 객체를 제거하고, 참조되는 객체는 Survivor영역으로 이동시킵니다.
  3. Survivor 영역에서 일정 횟수 이상 Minor GC를 거친 객체는 Old Generation 영역으로 승격됩니다.
  4. Old Generation이 꽉 차면 Major GC가 발생하여 참조되지 않는 오래된 객체를 제거합니다.

 

1. Young Generation

생성된 객체가 제일 처음 할당되는 영역 / Minor GC가 발생하는 영역

Young Generation의 구성
  • Eden 영역 : 새롭게 생성된 객체가 처음 할당되는 곳 (에덴동산...🌳)
  • Survivor 영역 : Eden 영역에서 GC를 거친 후 살아남은 객체가 이동하는 곳
    • Survivor 0 과 Survivor 1 을 번갈아 사용하여 불필요한 객체를 빠르게 제거 (효율적인 Minor GC 수행)
Minor GC

Young Generation에서 발생하는 가비지 컬렉션

  • Eden 영역이 가득 찼을 때 발생
  • Stop-the-World가 짧게 발생하여 성능에 미치는 영향은 상대적으로 적다.

 

2. Old Generation

Young Generation에서 여러번 GC를 거쳐 살아남은 객체가 승격되는 영역 / Major GC가 발생하는 영역

Major GC

Old Generation에서 발생하는 가비지 컬렉션

  • 더 이상 Old Generation에서 객체를 수용할 수 없을 때 발생
  • Stop-the-World가 상대적으로 긴 시간동안 발생하여 성능에 미치는 영향이 큼
더보기
💡승격(Promotion)
Young Generation 영역에서 일정 횟수이상의 Minor GC를 거쳐 기준이 충족되어 Old Generation으로 이동하는 것

 

3. Permenant Generation ( Metaspace )

Java 8 이후로 힙 영역은 Young Generation 과 Old Generation으로만 구성되며, Java 7까지 클래스 메타데이터를 관리하던 Permanent Generation은 제거되었고, 대신 Metaspace라는 새로운 메모리 공간이 되었습니다.

+ 메타스페이스는 힙 영역이 아닌 네이티브 메모리(Native Memory)에 위치합니다.

'CS 스터디 > CS - JAVA' 카테고리의 다른 글

String, StringBuilder, StringBuffer 특징 및 성능비교  (0) 2025.03.26
String 객체와 String 리터럴  (0) 2025.03.25
객체 지향 프로그래밍(OOP)의 특징 4가지  (0) 2025.03.22
JVM의 구조  (0) 2025.03.19
JAVA의 실행 과정  (0) 2025.03.19
'CS 스터디/CS - JAVA' 카테고리의 다른 글
  • String 객체와 String 리터럴
  • 객체 지향 프로그래밍(OOP)의 특징 4가지
  • JVM의 구조
  • JAVA의 실행 과정
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • 알고리즘 (53)
        • 백준 (44)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    너비 우선 탐색
    Lv2
    프로그래머스
    재귀
    자료구조
    완전탐색
    bottom-up
    백준
    dp
    DFS
    java
    CS
    깊이 우선 탐색
    알고리즘 고득점 kit
    Baekjoon
    Top-Down
    동적 계획
    BFS
    브루트포스
    기술질문
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
Garbage Collection
상단으로

티스토리툴바