Notice
Recent Posts
Recent Comments
Link
변수의 기록
(운영체제) JAVA Garbage Collection: Mark and Sweep 본문
CS지식/운영체제 (Operating System)
(운영체제) JAVA Garbage Collection: Mark and Sweep
불광동 물주먹 2025. 6. 13. 00:44Garbage Collection: Mark and Sweep
**Garbage Collection(GC)**은 자바에서 자동으로 메모리를 관리하는 핵심 기능이다.
사용되지 않는 객체를 자동으로 탐지하고 제거하여 메모리 누수를 방지하고,
개발자가 명시적으로 free()나 delete를 호출할 필요 없이 안정적인 메모리 관리가 가능하다.
왜 GC가 필요한가?
자바에서 객체를 생성하면 JVM의 힙 메모리에 저장된다.
하지만 어떤 객체가 더 이상 사용되지 않음에도 메모리에 남아 있다면,
사용 불가능한 메모리가 점점 쌓여 시스템 전체의 성능을 떨어뜨릴 수 있다.
GC는 이러한 "사용되지 않는 메모리"를 자동으로 정리해주는 시스템이다.
GC의 기본 방식 1: Reference Counting (참조 카운팅)
객체가 몇 개의 참조를 받고 있는지 수를 세어,
참조 수가 0이 되면 제거하는 방식.
A → B → A // 서로 참조하면 count가 0이 되지 않음 (순환 참조 문제 발생)
- 장점: 간단하고 빠르다
- 단점: 순환 참조 문제 해결 불가
GC의 실제 방식: Mark and Sweep (JVM 기본 방식)
자바의 GC는 Reference Counting의 한계를 극복한 Mark and Sweep 알고리즘을 사용한다.
1. Mark 단계
- GC Root (예: 스택, static 변수 등)에서 시작하여,
참조를 따라가며 사용 중인 객체들을 탐색하고 mark 표시를 붙인다.
2. Sweep 단계
- Mark되지 않은 객체는 더 이상 접근할 수 없는 객체로 판단하고 메모리에서 제거(sweep)한다.
A → B → A // 서로 참조하면 count가 0이 되지 않음 (순환 참조 문제 발생)
장점
- 순환 참조도 제거 가능 (mark되지 않으면 모두 제거됨)
- 객체 생존 여부 판단이 정확함
Stop-the-World란?
GC가 동작하는 동안 모든 애플리케이션 스레드가 멈추는 현상이다.
즉, Mark and Sweep이 실행되는 동안 프로그램 로직은 일시 중단된다.
- GC가 오래 걸릴수록 성능 저하, 응답 지연이 생김
- 그래서 최신 GC는 Stop-the-world 시간을 줄이기 위한 다양한 전략 사용
JVM의 힙 구조와 GC 세대(Generation)
자바는 객체 생명 주기에 따라 메모리를 나누어 관리한다. 대표적인 구조는 다음과 같다:
영역 | 설명 |
Young Generation | 새로 생성된 객체 저장, 대부분 여기서 GC 발생 (Minor GC) |
Old Generation | 오래 살아남은 객체 저장, Full GC 대상 (Major GC) |
Eden, Survivor | Young 내부에서 객체가 이동하며 생존 여부 판별 |
GC 종류 예시 (HotSpot JVM 기준)
GC 이름 | 특징 |
Serial GC | 단일 스레드, 작은 애플리케이션에 적합 |
Parallel GC | 다중 스레드 사용 (기본 설정) |
CMS GC | Stop-the-world 시간 줄임, 점점 Deprecated |
G1 GC | Full GC 정리도 병렬로 나눠 처리 |
ZGC, Shenandoah | 최신 GC, 대용량 메모리에서 짧은 지연 시간 |
DTO나 Bean은 언제 GC 되는가?
- Spring Bean 객체들은 ApplicationContext가 참조하고 있어서,
애플리케이션 종료 전까지 GC 대상이 되지 않는다. - 반면, DTO, 지역 변수 객체 등은 일시적으로 생성되며,
더 이상 참조되지 않으면 GC가 수거할 수 있다.
'CS지식 > 운영체제 (Operating System)' 카테고리의 다른 글
(os) 비동기(Asynchronous) 프로그래밍과 운영체제 관점의 이해 (0) | 2025.04.18 |
---|---|
(OS) Block I/O vs Non-block I/O (소켓 I/O 기반 설명) (0) | 2025.04.17 |
(OS) Thread Per Request vs Thread Pool 모델 정리 (쓰레드 비교) (0) | 2025.04.15 |
(os) 커널이란 무엇인가? (예시 포함 아주 쉽게 설명) (0) | 2025.04.15 |
(OS) 스레드의 종류 (하드웨어, OS, 유저 , 그린 ,커널) (0) | 2025.04.14 |