안녕하세요,
오늘은 Java 프로그림이 실행되는 환경인 JVM(Java Virtual Machine)의 메모리 구조에 대해 알아보겠습니다.
JVM(Java Virtual Machine)이란?
JVM은 Java 프로그램을 실행하는 가상 머신 입니다.
java 코드는 cpu가 직접 실행할 수 없고, JVM이 바이트 코드로 변환해서 실행합니다.
따라서 OS관계없이 실행할 수 있습니다.
JVM은 실행 중 메모리를 관리하고, GC(Garbage Collection)로 불필요한 객체를 정리해 줍니다.
JVM 구조
JVM은 크게 3개의 영역으로 나뉩니다.
1. 클래스 로더(Class Loader) : .class 파일 로드
2. 런타임 데이터 영역(Runtime Data Area) : java 실행에 필요한 메모리 공간
3. 실행 엔진(Excution engine) : 바이트코드를 실제 CPU 명령어로 변환
이 중 런타임 데이터 영역 에 대해 자세히 알아보겠습니다.
런타임 데이터 영역(Runtime Data Area) - JVM 메모리 구조
.
1) Method Area (메서드 영역)
- 클래스의 구조 정보(메서드, 변수, static 데이터)가 저장됨
- static 변수, 상수, 메서드 코드, 인터페이스 정보 등이 들어감
- JVM이 종료될 때까지 유지됨
- Heap과 공유되는 영역 → 모든 스레드가 접근 가능
class Car {
static int wheelCount = 4; // Method Area에 저장됨 (static 변수)
String model = "Tesla"; // Heap에 저장됨 (인스턴스 변수)
}
wheelCount (static 변수) → Method Area에 저장됨
model (인스턴스 변수) → Heap에 저장됨
2) Heap(힙 영역)
- 객체(인스턴스)와 인스턴스 변수들이 저장됨
- new 키워드로 생성된 객체가 여기에 저장됨
- GC(Garbage Collector)가 더 이상 필요 없는 객체를 정리하는 곳
Car car1 = new Car(); // Heap에 저장됨
Car car2 = new Car(); // Heap에 저장됨
car1, car2 객체는 Heap에 저장됨
car1.model, car2.model 같은 인스턴스 변수도 Heap에 저장됨
3) Stack(스택 영역)
- 메서드 호출 시 생성되는 지역 변수(primitive type)와 참조 변수가 저장됨
- 메서드가 호출될 때마다 **스택 프레임(Stack Frame)**이 생성됨
- 메서드가 종료되면 자동으로 스택에서 제거됨
void method() {
int x = 10; // Stack에 저장됨 (지역 변수)
Car car = new Car(); // car 참조 변수는 Stack에, 객체는 Heap에 저장됨
}
x (지역 변수) → Stack에 저장됨
car (참조 변수) → Stack에 저장됨, 그러나 객체 자체는 Heap에 저장됨
4) PC Register(PC 레지스터)
- 현재 실행 중인 JVM 명령어 주소를 저장하는 공간
- 각 스레드마다 개별적으로 존재함 (스레드별 독립적)
- 멀티스레드 환경에서 각 스레드의 실행 위치를 추적하는 역할
스레드 A가 method1() 실행 중 → PC Register에는 method1()의 명령어 주소 저장됨
스레드 A가 method2()로 이동 → PC Register 값이 업데이트됨
5) Native Method Stack(네이티브 메서드 스택)
- Java가 아닌 네이티브 코드(C, C++) 실행 시 사용되는 메모리 영역
- JNI (Java Native Interface)를 사용할 때 필요함
public class NativeExample {
native void callNative(); // C/C++ 코드 실행
}
callNative() 실행 시 네이티브 메서드 스택을 사용함
'Java' 카테고리의 다른 글
[JAVA] Thread와 Runnable (0) | 2025.03.09 |
---|---|
[Java] 스레드를 활용해서 여러 파일 동시에 다운로드 받기 (2) | 2025.03.06 |
[JAVA] WeakReference, SoftReference 사용법 (2) | 2025.02.23 |
[JAVA] 자바 인텔리제이에서 DB 데이터베이스 접속하기 (0) | 2024.08.27 |
[JAVA] 인텔리제이 IntelliJ IDEA JAR 파일 생성/ 만들기 (0) | 2024.08.21 |