개발언어/Java

JVM 가비지 컬렉션: 객체 생사 판단과 메모리 정리 알고리즘

eodevelop 2025. 5. 14. 13:18
반응형

 JVM(Java Virtual Machine)은 메모리를 효율적으로 관리하기 위해 가비지 컬렉션(Garbage Collection)을 수행합니다. 이는 더 이상 사용되지 않는 객체를 찾아 메모리를 회수하는 과정입니다. 해당 글에서는 JVM이 객체의 생사를 판단하는 방법과 메모리를 정리하는 알고리즘을 설명합니다.

1. 객체의 생사 판단

JVM은 프로그램에서 더 이상 참조되지 않는 객체, 즉 '죽은' 객체를 식별하여 정리 대상으로 지정합니다. 이를 판단하는 두 가지 주요 알고리즘은 다음과 같습니다.

1.1 참조 카운팅 (Reference Counting)

  • 설명: 각 객체에 참조 횟수를 기록하는 카운터를 유지합니다. 객체가 참조될 때 카운터를 증가시키고, 참조가 끊기면 감소시킵니다.
  • 판단 기준: 카운터가 0이 되면 해당 객체는 더 이상 사용되지 않는 것으로 간주됩니다.
  • 특징: 자바의 JVM에서는 이 방식을 사용하지 않습니다. 이는 객체들이 서로를 참조할 때 발생하는 "순환 참조" 문제 때문입니다. 순환 참조 상태에서는 객체들이 계속 서로 참조하기 때문에 카운트가 0이 되지 않아 정리가 불가능해집니다.

1.2 도달 가능성 분석 (Reachability Analysis)

  • 설명: GC 루트(GC Roots)라는 시작점에서 객체 간 참조 관계를 탐색합니다. 이를 통해 참조 체인(reference chain)을 확인합니다.
더보기

GC 루트(GC Roots)란?

 

GC 루트는 JVM이 객체의 생사를 판단할 때 시작점으로 삼는 객체들입니다. 예를 들어, 메서드를 실행할 때 사용하는 지역 변수나 클래스가 사용하는 정적 필드와 같은 객체들이 GC 루트가 됩니다. 쉽게 말해, "프로그램이 바로 접근할 수 있는 출발점"이라고 생각하면 됩니다. 이 출발점에서 시작하여 따라갈 수 있는 모든 객체는 살아있는 것이고, 도달할 수 없는 객체는 죽은 것으로 간주하는 것입니다.

GC 루트의 주요 예시는 다음과 같습니다:

  • 메서드의 지역 변수
  • 정적(static) 필드
  • 메서드 영역의 상수
  • 판단 기준: GC 루트에서 도달할 수 없는 객체는 사용되지 않는 것으로 판단됩니다.
  • 특징: 자바, C# 등과 같이 최근 자주사용되는 언어들에서는 도달가능성 분석 알고리즘이 주로 사용됩니다. 클래스나 상수와 같은 메서드 영역도 정리 대상이 될 수 있으나, 이는 비용이 크며 일부 JVM에서는 선택적으로 수행됩니다.

2. 가비지 컬렉션 알고리즘

죽은 객체를 식별한 후, JVM은 다양한 알고리즘을 사용하여 메모리를 회수합니다. 주요 알고리즘은 다음과 같습니다.

2.1 세대 단위 컬렉션

  • 설명: 객체를 생성 시점에 따라 신세대(Young Generation)와 구세대(Old Generation)로 나눠 관리합니다.
  • 가정:
    • 약한 세대 가설: 대부분의 객체는 생성 후 곧바로 사용되지 않습니다.
    • 강한 세대 가설: 오래 살아남은 객체는 더 오래 유지될 가능성이 높습니다.
  • 컬렉션 종류:
    • 마이너 GC: 신세대만 정리합니다.
    • 메이저 GC: 구세대만 정리합니다.
    • 혼합 GC: 신세대 전체와 구세대 일부를 정리합니다.
    • 전체 GC: 힙 메모리 전체와 메서드 영역을 정리합니다.
  • 특징: 세대 간 참조를 관리하기 위해 기억 집합(Remembered Set)과 같은 데이터 구조를 사용합니다.

2.2 마크-스윕 (Mark-Sweep)

  • 설명: 살아 있는 객체를 표시(Mark)한 후, 표시되지 않은 객체를 제거(Sweep)합니다.
  • 단점:
    • 객체가 많을 경우 처리 시간이 길어집니다.
    • 메모리 파편화가 발생하여 연속된 메모리 할당이 어려워질 수 있습니다.

2.3 마크-카피 (Mark-Copy)

  • 설명: 살아 있는 객체를 다른 메모리 공간으로 복사한 후, 원래 공간을 비웁니다.
  • 장점: 메모리 파편화가 발생하지 않습니다.
  • 단점: 메모리 공간의 절반만 사용 가능하며, 살아 있는 객체가 많을 경우 복사 비용이 증가합니다.
  • 용도: 주로 신세대 정리 시 사용됩니다.

2.4 마크-컴팩트 (Mark-Compact)

  • 설명: 살아 있는 객체를 표시한 후, 이를 한쪽으로 이동(Compact)시켜 연속된 메모리 공간을 만듭니다.
  • 장점: 파편화가 없고 메모리 사용 효율이 높습니다.
  • 단점: 객체 이동에 시간이 소요됩니다.
  • 용도: 구세대 정리 또는 파편화가 심할 때 사용됩니다.

3. 결론

JVM의 가비지 컬렉션은 도달 가능성 분석을 통해 사용되지 않는 객체를 식별하고, 세대 단위로 나눠 마크-스윕, 마크-카피, 마크-컴팩트 알고리즘을 적용하여 메모리를 효율적으로 관리합니다. 이를 통해 자바 프로그램은 메모리 부족 문제를 방지하고 안정적으로 실행됩니다.

반응형

'개발언어 > Java' 카테고리의 다른 글

JVM 메모리 구조  (0) 2025.05.13
[JAVA] JAVA 지역 변수의 범위  (0) 2019.11.21
[Java] Java문법 for, for-each  (0) 2019.11.21
JAVA 지역 변수의 범위 최소화  (0) 2019.10.01
JAVA 기초 CLASS란  (0) 2019.08.06