JAVA

Garbage Collection

국자집사 2025. 1. 17. 03:44

[ 목차 ]

     

    1. GC란 무엇인가?

    Garbage Collection은 프로그래밍 언어에서 자동 메모리 관리를 담당하는 중요한 기술이다. Java에서는 개발자가 명시적으로 메모리를 해제하지 않아도 GC가 이를 자동으로 처리해주므로 메모리 누수를 방지하고 안정적인 프로그램 실행 환경을 제공한다. 이는 C/C++과 같은 언어에서 수동 메모리 관리를 해야 하는 복잡함을 해소하며, 프로그래머가 비즈니스 로직에 집중할 수 있도록 돕는다.

    GC사용되지 않는 객체를 식별하고 메모리에서 제거하여 새로운 객체 생성에 필요한 공간을 확보한다. Java의 GC는 JVM에서 실행되며, 다음과 같은 주요 목적을 갖는다:

    1. 자동 메모리 관리 : 프로그래머가 명시적으로 메모리 할당과 해제를 하지 않아도 된다.
    2. 메모리 누수 방지 : 참조되지 않는 객체를 제거하여 시스템의 메모리 안정성을 보장한다.
    3. 효율적인 메모리 사용 : 메모리를 정리하고 압축하여 단편화를 줄임으로써 성능을 향상시킨다.

    왜 GC가 필요한가?

    Java는 C/C++과 달리 메모리를 자동으로 관리한다. 이는 개발자의 편의성을 높이는 동시에 메모리 누수와 같은 문제를 방지한다. 예를 들어, C++에서는 사용자가 객체를 명시적으로 삭제하지 않으면 메모리 누수가 발생할 수 있다. 반면 Java는 GC를 통해 참조되지 않는 객체를 자동으로 제거하여 안정성과 생산성을 높일 수 있다.

     

    2. GC의 동작 원리

    2-1. 객체의 생명주기

    1. 객체 생성 : 객체는 힙(Heap) 메모리에 생성된다.
    2. 사용 중인 객체(Reachable) : 참조되는 객체는 메모리에서 제거되지 않는다.
    3. 사용되지 않는 객체(Unreachable) : 더 이상 참조되지 않는 객체는 GC의 대상이 된다.

     

     

    2-2. GC의 주요 작업 단계

    1. 마킹(Marking):
      • GC는 어떤 객체가 여전히 사용 중인지 확인한다.
      • 참조 그래프(Reference Graph)를 활용하여 도달 가능한 객체를 식별한다.
    2. 스위핑(Sweeping):
      • 참조되지 않는 객체를 힙에서 제거하여 메모리를 해제한다.
    3. 컴팩팅(Compacting):
      • 메모리 단편화를 방지하기 위해 남아 있는 객체를 연속된 메모리 블록으로 이동한다.

    1.  

    2-3. Stop-the-World란?

    • GC가 실행되는 동안 애플리케이션의 모든 스레드를 중단시키는 이벤트를 의미한다.
    • Stop-the-World는 GC가 메모리를 정리하는 동안 시스템 일관성을 유지하기 위해 필수적이다.
    • 이 과정은 짧은 시간이지만, 응답 시간에 민감한 애플리케이션에서는 성능 저하를 유발할 수 있다.

     

    2-4. GC의 트리거란?

    GC 트리거는 GC가 실행되는 계기를 의미하며, 다음과 같은 조건에서 발생한다 :

    1. 힙 메모리 부족: Young Generation이나 Old Generation의 공간이 부족할 때.
    2. 명시적 호출: System.gc() 메서드 호출.
    3. JVM 옵션 설정: 특정 조건에서 GC를 유도하는 JVM 설정 옵션 활용.
     

    3. GC의 메모리 구조

    JVM은 힙 메모리를 다음과 같이 구성한다:

    1. Young Generation:
      • 새로 생성된 객체가 저장되는 공간으로, 객체의 생애 초기를 관리한다.
      • Young Generation은 아래와 같이 세분화된다:
        • Eden 영역: 새로 생성된 모든 객체가 먼저 저장되는 영역으로, 대부분의 객체가 이 영역에서 생성된다.
        • Survivor 영역: Eden에서 살아남은 객체가 이동하며, Survivor0과 Survivor1로 나뉘어 번갈아 가며 사용된다.
        • Eden에서 Minor GC가 발생할 때, 사용 중인 객체는 Survivor 영역으로 이동하며, 불필요한 객체는 제거된다.
    2. Old Generation:
      • Young Generation에서 오래 살아남은 객체가 저장되는 공간.
      • 장기적으로 참조되는 객체가 저장되며, Young Generation보다 더 큰 크기를 가진다.
      • Old Generation에서 Major GC가 발생하며, 불필요한 객체를 제거하거나 메모리를 압축하여 단편화를 방지한다.
    3. Metaspace:
      • 클래스 메타데이터와 같은 정보를 저장하는 공간.
      • Java 8 이전에는 PermGen으로 불렸으며, Java 8 이후 Metaspace로 변경되었습니다.
      • Metaspace는 JVM 외부의 네이티브 메모리를 사용하여 메모리 부족 문제를 완화합니다.

     


    4. Minor GC와 Major GC

    4-1. Minor GC

    • 발생 위치: Young Generation에서 발생.
    • 동작 방식:
      • Eden 영역의 객체를 Survivor 영역으로 이동하거나 제거합니다.
      • Young Generation의 메모리를 주기적으로 비우는 작업.
    • 특징:
      • 실행 속도가 빠르며 빈번하게 발생.
      • 애플리케이션 성능에 상대적으로 적은 영향을 미침.

    Minor GC 과정 예시

    1) 처음 생성된 객체는 Young Generation 영역의 일부인 Eden 영역에 위치

     

    2) 객체가 계속 생성되어 Eden영역이 꽉차게 되고 Minor GC가 실행

     

    3) Mark 동작을 통해 Reachalble 객체를 탐색 후 살아남은 객체는 Survivor 영역으로 이동

     

    4) Eden 영역에서 사용되지 않는 객체(Unreachalbe)의 메모리를 해제(Sweep),

       살아남은 객체는 age값이 1씩 증가

     

    5) 또다시 Eden 영역이 신규 객체로 가득 차게되면 다시 Minor GC 발생하고 mark한다.

     

    6) marking한 객체를 비어있는 Survivor 영역으로 이동하고 나머지 객체를 Sweep한다.

        다시 살아남은 객체의 age 값을 1씩 증 

     

    7) 이러한 과정을 반복

     

    4-2. Major GC

    • 발생 위치: Old Generation에서 발생.
    • 동작 방식:
      • Young Generation에서 오래 살아남아 Old Generation으로 이동한 객체를 대상으로 수행.
      • 사용되지 않는 객체를 제거하며, 필요한 경우 메모리를 압축하여 단편화를 해결.
    • 특징:
      • 실행 시간이 길고 Stop-the-World 이벤트의 영향을 크게 받음.
      • 애플리케이션 성능에 미치는 영향이 큼.

    Major GC 과정 예시

    1) 객체의 age 값이 설정한 임계값(여기선 8로 설정)에 도달하게 되면, 해당 객체를 Old Generation으로 이동한다.(promotion)

     

    2) 위의 과정이 반복되어 Old Generation 영역의 공간이 부족하게 되면, Old 영역에 있는 모든 객체를 검사하여 참조되지 않는 객체를 한번에 삭제하는 Major GC가 발생한다.

     

     

    일반적으로 Young 영역은 Old 영역보다 크기가 작기 때문에 Minor GC가 0.5초 - 1초 사이에 끝난다. 그렇게 때문에 Minor GC는 애플리케이션에 크게 영향을 주지 않는다.

    하지만 Old 영역의 Major GC는 일반적으로 Minor GC보다 10배 이상의 시간을 사용하기 때문에 여기서 Stop-The World 문제가 발생하게 된다.

     

    5. GC의 장단점

    5-1. GC의 장점

    • 자동 메모리 관리: 개발자가 명시적으로 메모리를 해제하지 않아도 됨.
    • 메모리 누수 방지: 더 이상 참조되지 않는 객체를 자동으로 제거.
    • 안정성 향상: 메모리 관리 실수로 인한 충돌을 방지.

    5-2. GC의 단점

    • Stop-the-World 이벤트: GC 실행 중 애플리케이션 스레드가 중단되므로 응답 시간이 느려질 수 있음.
    • 성능 오버헤드: 적절한 설정이 없으면 GC 동작이 성능 저하를 초래.
    • 제어 부족: GC의 세부 동작은 JVM이 관리하며, 프로그래머의 직접 개입이 제한적.
     

    6. 다이어그램으로 정리해보기


    GC는 Java의 핵심 요소로, 자동 메모리 관리와 프로그램 안정성을 제공한다. 다양한 메모리 구조를 통해 메모리를 효율적으로 관리하며, G1 GC와 같은 최신 GC는 성능과 안정성을 더욱 개선할 수 있다. GC를 올바르게 이해하고 적절히 활용하면 애플리케이션의 성능과 안정성을 크게 향상시킬 수 있다.

     

     

     

    출처

    https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%EC%85%98GC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%F0%9F%92%AF-%EC%B4%9D%EC%A0%95%EB%A6%AC?category=976278

     

    ☕ 가비지 컬렉션 동작 원리 & GC 종류 💯 총정리

    Garbage Collection(GC) 이란? 가비지 컬렉션(Garbage Collection, 이하 GC)은 자바의 메모리 관리 방법 중의 하나로 JVM(자바 가상 머신)의 Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객

    inpa.tistory.com

    https://mangkyu.tistory.com/118

     

    [Java] Garbage Collection(가비지 컬렉션)의 개념 및 동작 원리 (1/2)

    1. Garbage Collection(가비지 컬렉션)이란? [ Garbage Collection(가비지 컬렉션)이란? ] 프로그램을 개발 하다 보면 유효하지 않은 메모리인 가바지(Garbage)가 발생하게 된다. C언어를 이용하면 free()라는 함

    mangkyu.tistory.com

    https://velog.io/@yarogono/Java%EA%B0%80%EB%B9%84%EC%A7%80-%EC%BB%AC%EB%A0%89%ED%84%B0Garbage-Collector%EB%9E%80

     

    [Java]가비지 컬렉터(Garbage Collector)란?

    JVM GC가 Heap에서 사용하지 않는 객체를 메모리를 해제해준다. 하지만 어떻게 동작하고 어떤 알고리즘을 사용 하는지 알아보지 못해서 글로 작성해봤다. 단순히 암기가 아닌 시각적인 사진들을

    velog.io

     

    'JAVA' 카테고리의 다른 글

    자바 컬렉션 프레임워크  (0) 2024.12.10
    Enum이란?  (1) 2024.11.01
    오버로딩 vs 오버라이딩  (7) 2024.10.23
    자바에서의 Error & Exception  (0) 2024.10.21
    JDK/JRE/JVM 개념  (0) 2024.10.14