가비지 컬렉터

LJM·2023년 9월 8일
0

Java

목록 보기
22/33

Java Virtual Machine (JVM)에서의 가비지 컬렉터는 메모리 관리를 자동화하여 프로그래머가 명시적으로 메모리를 해제할 필요가 없게 해줍니다. 아래는 JVM의 가비지 컬렉터와 관련된 주요 개념과 지식입니다.

작동원리

  1. 객체 생성과 할당
    먼저, 자바 애플리케이션 코드가 실행되면서 객체가 생성됩니다. 이 객체들은 초기에는 Heap의 Young Generation 영역의 Eden Space에 할당됩니다.

  2. Minor GC와 객체 이동
    Eden Space가 가득 차게 되면, Minor GC(Minor Garbage Collection)이 실행됩니다. 이 과정에서 쓸모없어진 객체는 메모리에서 제거되고, 아직 필요한 객체는 Survivor Space로 이동합니다.

  3. 객체의 '나이' 증가
    Survivor Space로 이동한 객체들의 '나이'가 증가합니다. 여기서 '나이'란 객체가 얼마나 오래 살아남았는지를 나타내는 카운터입니다.

  4. Old Generation으로의 Promotion
    객체가 특정 '나이'에 도달하거나 Survivor Space가 가득 차면, 그 객체는 Old Generation으로 이동됩니다.

  5. Major GC
    Old Generation이 가득 차거나 특정 조건을 만족하면, Major GC(Major Garbage Collection) 또는 Full GC가 실행됩니다. 이 과정은 전체 Heap 영역을 대상으로 하며, 메모리에서 제거되어야 할 객체를 찾아 메모리를 해제합니다.

  6. Stop-The-World
    Minor GC나 Major GC가 실행될 때는 일반적으로 "Stop-The-World" 이벤트가 발생합니다. 즉, 모든 애플리케이션 스레드가 일시 중지되고, 오직 가비지 컬렉션만이 실행됩니다. 이 시간이 길어지면 애플리케이션의 성능에 부정적인 영향을 미칠 수 있습니다.

  7. 메모리 해제
    가비지 컬렉션 과정을 통해 메모리에서 제거되어야 할 객체가 식별되면, 그 메모리 공간은 해제되어 다시 사용할 수 있게 됩니다.

가비지 컬렉터의 종류나 설정에 따라 위의 과정은 다소 달라질 수 있습니다. 예를 들어, G1 Garbage Collector는 여러 개의 작은 메모리 영역을 사용하여 더 빠르고 효율적인 가비지 컬렉션을 수행합니다.

가비지 컬렉션의 유형

Minor GC: Young Generation을 대상으로 수행됩니다. 대부분 빠르게 수행되며, Stop-The-World 이벤트가 짧습니다.
Full GC (Major GC): 전체 Heap을 대상으로 수행됩니다. 메모리 해제 작업이 복잡하고 시간이 오래 걸릴 수 있으며, 긴 Stop-The-World 이벤트를 발생시킵니다.

가비지 컬렉터의 종류

Serial GC: 단일 스레드를 사용하여 가비지 컬렉션을 수행합니다. 간단한 애플리케이션과 작은 데이터를 다루는 경우에 적합합니다.
Parallel GC: 여러 스레드를 사용하여 Young Generation의 가비지 컬렉션을 병렬로 수행합니다. 다중 프로세서 환경에 적합합니다.
CMS (Concurrent Mark-Sweep) GC: Old Generation에 대한 가비지 컬렉션을 주로 다룹니다. 애플리케이션의 응답 시간이 중요할 때 사용됩니다.
G1 (Garbage First) GC: 힙을 여러 영역으로 나누고, 가비지가 가장 많이 발생한 영역부터 수집합니다. 대용량 힙에서 높은 성능과 예측 가능한 GC 퍼포먼스를 제공합니다.

JVM 플래그와 설정
JVM의 행동을 조절하기 위한 다양한 플래그와 설정이 있습니다. 예를 들어, 어떤 가비지 컬렉터를 사용할 것인지, 힙의 최대 크기는 얼마로 할 것인지 등을 설정할 수 있습니다.

성능 튜닝
JVM과 가비지 컬렉터의 성능은 애플리케이션의 요구 사항, 메모리 사용량, 프로세서 수 등 다양한 요인에 따라 최적화할 수 있습니다.

가비지 컬렉션은 JVM의 중요한 부분이며, 이해하고 올바르게 조절하면 애플리케이션의 성능과 응답 시간을 크게 향상시킬 수 있습니다.

GC 작동원리

  1. Mark (마킹)
    가비지 컬렉터는 먼저 루트(root) 객체로부터 시작해서 접근 가능한 객체를 찾아 나갑니다. 루트 객체는 일반적으로 스택 메모리에 있는 변수, 전역 변수, CPU 레지스터 등이 될 수 있습니다. 마킹 단계에서는 이러한 루트 객체로부터 직접적이거나 간접적으로 참조할 수 있는 모든 객체를 찾아 "살아있다"고 표시(Mark)합니다.

  2. Sweep (스위핑)
    마킹이 완료되면, 가비지 컬렉터는 메모리를 전체 스캔하여 "살아있다"고 표시되지 않은 객체, 즉 "접근 불가능한 객체"를 찾아 메모리에서 제거(Sweep)합니다.

  3. Compact (압축) - 선택적
    일부 가비지 컬렉션 알고리즘은 메모리 단편화를 줄이기 위해 "압축" 단계를 거칩니다. 이 단계에서는 "살아있는 객체"를 메모리의 한쪽 끝으로 옮기고, 빈 공간을 다른 쪽 끝으로 모읍니다. 이렇게 하면 새로운 객체를 할당할 때 연속된 메모리 공간을 더 쉽게 찾을 수 있습니다.

profile
게임개발자 백엔드개발자

0개의 댓글