자바로 프로그래밍을 하다 보면 "메모리 누수(Memory Leak)"라던가
"애플리케이션이 멈췄다"는 이야기를 종종 듣게 됩니다.
우리가 작성한 코드는 컴퓨터 내부에서 정확히 어떻게 저장되고 실행되는
것일까요?
자바가 운영체제와 상관없이 어디서든 실행될 수 있는 이유는 바로
JVM(Java Virtual Machine) 덕분입니다.
하지만 이 JVM 내부를 모른다면 효율적인 프로그램을 짤 수 없습니다.
오늘은 자바 개발자라면 반드시 알아야 할 JVM의 메모리 구조와, 자동으로
메모리를 청소해 주는 가비지 컬렉션(GC)의 마법 같은 원리를
아주 쉽게 파헤쳐 보겠습니다.
🧩 1. JVM(Java Virtual Machine)이란 무엇인가?
JVM은 직역하면 '자바 가상 머신'입니다.
우리가 작성한 자바 코드(.java)를 컴파일하면 바이트코드(.class)가 되는데,
이 코드를 운영체제가 이해할 수 있도록 해석하고 실행해 주는 '가상의 컴퓨터'
역할을 합니다.
💡 JVM의 핵심 역할 3가지
-
클래스 로더(Class Loader): 바이트코드를 읽어 메모리에
적재합니다.
-
실행 엔진(Execution Engine): 적재된 코드를 해석하고
실행합니다.
-
런타임 데이터 영역(Runtime Data Area): 프로그램
실행에 필요한 메모리를 할당받는 곳입니다.
오늘 우리가 집중해서 살펴볼 곳은 바로 데이터를 저장하는 창고,
'런타임 데이터 영역(메모리)'입니다.
🏗️ 2. JVM 메모리 구조 (Runtime Data Area)
JVM의 메모리는 효율적인 관리를 위해 크게 5가지 영역으로 나뉩니다.
이 중 가장 중요한 곳은 Stack(스택)과
Heap(힙) 영역입니다.
📦 Heap Area (힙 영역)
- 객체(Instance)와 배열이 생성되는 공간입니다.
- 모든 스레드가 공유하는 공용 공간입니다.
- GC(가비지 컬렉션)의 주요 대상이 되는 곳입니다.
- 프로그램 실행 중 생성된 데이터들이 이곳에 쌓입니다.
📚 Stack Area (스택 영역)
- 메서드 호출 시 생성되는 지역 변수, 매개 변수가
저장됩니다.
- 메서드가 종료되면 즉시 메모리에서 사라집니다.
- 각 스레드마다 별도로 생성되는 사적인 공간입니다.
- Heap 영역에 있는 객체의 주소값(참조값)을 가집니다.
🔍 Stack vs Heap 한눈에 비교
| 구분 | Stack 영역 | Heap 영역 |
|---|---|---|
| 저장 데이터 | 기본 타입 변수, 참조 변수 | 객체(new), 배열 |
| 생명 주기 | 메서드 호출 ~ 종료 | GC가 수거할 때까지 |
| 스레드 공유 | 공유 안 함 (독립적) | 모든 스레드 공유 |
이 외에도 클래스 정보를 담는 Method Area, 현재 실행
명령을 가리키는 PC Register 등이 존재하지만, 일반적인
개발 상황에서는 Stack과 Heap의 관계를 이해하는 것이 최우선입니다.
♻️ 3. 가비지 컬렉션 (Runtime Data Area)
C언어 같은 언어는 개발자가 메모리를 직접 할당(`malloc`)하고
해제(`free`)해야 했습니다.
하지만 자바는 가비지 컬렉터(Garbage Collector)라는
청소부가 있어서, 더 이상 사용되지 않는 객체를 자동으로 찾아내어 메모리를
회수합니다.
🛠️ GC의 동작 원리: Stop The World
GC가 실행될 때, GC를 실행하는 스레드를 제외한
모든 애플리케이션 스레드가 멈추는 현상을 말합니다.
어떤 훌륭한 GC 알고리즘도 이 멈춤 현상을 완전히 없앨 수는 없습니다.
따라서 GC 튜닝의 목표는 이 '멈춤 시간'을 줄이는 것입니다.
🔄 Heap 영역의 구분: Young & Old
효율적인 청소를 위해 Heap 영역은 물리적으로 두 공간으로 나뉩니다.
객체는 생성된 지 얼마나 되었느냐에 따라 다른 곳에 저장됩니다.
-
1. Young Generation (젊은 영역)
- 새롭게 생성된 객체가 위치합니다.
- 여기서 일어나는 GC를 Minor GC라고 부릅니다.
- 대부분의 객체는 금방 사용되지 않게 되므로(Unreachable), 많은 객체가 여기서 사라집니다.
-
2. Old Generation (늙은 영역)
- Young 영역에서 오랫동안 살아남은 객체가 이동(Promotion)해 오는 곳입니다.
- 크기가 크며, 여기서 일어나는 GC를 Major GC(또는 Full GC)라고 부릅니다.
- Full GC는 시간이 오래 걸리므로 성능에 큰 영향을 줍니다.
✨ 요약 및 정리
1. JVM은 자바 코드를 실행하는 가상 컴퓨터이며, 메모리
관리의 주체입니다.
2. 메모리는 주로 Stack(메서드, 변수)과
Heap(객체)으로 관리됩니다.
3. GC는 Heap 영역에서 사용하지 않는 객체를 자동으로
삭제합니다.
4. GC 과정에서 애플리케이션이 멈추는 Stop-the-World가
발생하므로, 이를 최적화하는 것이 성능 개선의 핵심입니다.
메모리 구조를 이해했다면, 이제 더 효율적인 코드를 작성할 준비가
되셨습니다!
불필요한 객체 생성을 줄이고, 유효 범위를 적절히 관리해보세요.


.png)
.png)
댓글 쓰기