⚡ Java - JVM 메모리 구조와 GC의 동작 원리
⚡ Java - JVM 메모리 구조와 GC의 동작 원리
🔹 JVM
메모리 구조
JVM
은Java
애플리케이션 실행을 위해 여러 메모리 영역을 나눠 관리한다.
▫️ 메서드 영역(Method Area
)
- 클래스의 구조 정보,
static
변수, 상수 풀 등이 저장 - 모든 스레드가 공유
JDK 8
이후로는Metaspace
로 대체
▫️ 힙 영역(Heap
)
- 객체가 생성되는 공간
GC
의 주요 대상Young
영역과Old
영역으로 나뉨
▫️ 스택 영역(JVM Stack
)
- 메서드 호출 시 생성되는 프레임 저장
- 지역 변수, 매개변수, 리턴 값 등 저장
- 각 스레드마다 독립적으로 존재
▫️ PC
레지스터, 네이티브 메서드 스택
- 각각의 스레드가 실행 중인 명령어 주소 저장
C/C++
로 작성된native
코드 실행에 사용
🔹 힙 영역의 세분화
▫️ Young Generation
- 새로 생성된 객체가 저장되는 공간
Eden
영역 + 두 개의Survivor
영역(S0
,S1
)으로 구성- 대부분의 객체는 이 영역에서 생성되고 소멸됨
▫️ Old Generation
Young
영역에서 살아남은 객체가 이동- 비교적 수명이 긴 객체가 존재
GC
발생 빈도는 낮지만, 한번 발생하면 비용이 큼
🔹 GC
의 기본 원리
GC
(Garbage Collection
)는 더 이상 사용되지 않는 객체를 탐지하고 제거하여 메모리를 회수하는 기능이다.
▫️ 참조 체계
- 객체가 다른 객체에 의해 참조되지 않을 때
GC
대상이 됨 JVM
은 참조 그래프 기반으로 객체 생존 여부를 판단
🔹 GC
알고리즘 종류
▫️ Mark and Sweep
- 사용 중인 객체를 표시(
mark
) - 미사용 객체를 제거(
sweep
) - 단점: 메모리 단편화 발생 가능
▫️ Copying
- 살아있는 객체를 새로운 공간으로 복사
- 복사 후 전체 메모리 정리
Young
영역에서 자주 사용(Minor GC
)
▫️ Mark-Compact
Mark and Sweep
이후, 살아있는 객체를 한쪽으로 몰아서 압축- 단편화 문제 해결
Old
영역에서 사용(Major GC
)
▫️ Generational GC
- 객체의 생존 기간에 따라
Young
과Old
로 나누어 관리 - 대부분의 객체는 생성 후 금방 사라진다는 가정에 기반
🔹 GC
의 종류(JVM
구현 기준)
▫️ Serial GC
- 단일 스레드로
GC
수행 - 단순 구조, 작은 애플리케이션에 적합
▫️ Parallel GC
- 여러 스레드로
Young
영역GC
수행 Throughput
위주
▫️ CMS
(Concurrent Mark-Sweep
)
GC
작업을 애플리케이션 실행과 병행 수행Stop-The-World
시간이 짧음- 단점: 메모리 단편화 가능
▫️ G1
GC
(Garbage First
)
Young
,Old
를 구분하지 않고Region
단위로 메모리 관리- 예측 가능한
GC
시간 제공 JDK 9
부터 기본GC
🔹 Minor GC
vs Major GC
구분 | Minor GC | Major GC (Full GC ) |
---|---|---|
대상 | Young 영역 | Old 영역 전체 |
속도 | 빠름 | 느림 |
발생 빈도 | 자주 | 드묾 (하지만 비용 큼) |
Stop-the-World | 발생함 | 발생함 |
🔹 GC
튜닝 시 고려 사항
- 애플리케이션의 메모리 사용 패턴 파악이 중요
Throughput
우선인지, 응답 시간 우선인지에 따라GC
선택 달라짐GC
로그 분석,-Xmx
,-Xms
,-XX:+UseG1GC
등의 옵션 사용
🔹 정리
JVM
의GC
는 객체의 생애주기를 관리하여 메모리 누수를 방지하고, 안정적인 메모리 사용을 보장한다.GC
알고리즘의 원리와JVM
내부 구조를 함께 이해하면, 성능 튜닝이나 장애 분석에 효과적으로 대응할 수 있다.
This post is licensed under CC BY 4.0 by the author.