반응형
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 |