JAVA
자바 메모리 구조
silver-w
2025. 7. 1. 20:36
□ JVM 실행 순서
.java → .class → 메모리(ClassLoader → 런타임 영역) |
- .java 파일을 컴파일러를 통해 바이너리 형태인 .class 파일로 변환
- .class 파일을 JVM 의 ClassLoader에게 보낸다.
- ClassLoader에서 클래스 파일을 JVM 런타임 영역으로 로드하여 메모리에 올린다.
□ JVM의 런타임 영역
- 메모리 영역들을 실행 시점(runtime)에 구성
- JVM은 OS로 부터 메모리를 할당 받고, 할당 받은 메모리를 자바 프로그램에 맞게 여러개의 영역으로 나누어 사용한다.
public class Memorys {
public static int number = 0; // static 변수 [Static 메모리]
String str = ""; // 인스턴스 변수 [주소 - Stack 영역 / 주소값 - Heap 메모리]
public static void main(String[] args) {
int local = 0; // 지역 변수 [Stack 메모리]
}
}
- Static(Method) 영역
- JVM이 실행될 때 생성되며, JVM 종료 시 메모리에서 해제된다. → 자원관리 필요
- Class 정보, Static 변수, 생성자, 메서드 저장
- 어디서든 접근이 가능 - Heap 영역
- 객체가 생성(new)할 때 저장되고, 호출이 종료되도 삭제되지 않는다. (GC대상)
- 참조형 데이터 타입이 저장된다. (String, Integer, 배열, enum, class, interface 등)
※ 참조형 데이터의 주소값은 Stack영역에 있으며, 주소값에서 가르키는 값은 Heap 영역에 존재한다.
- 쓰레드가 몇개가 존재 하든, 하나의 Heap 영역만 존재한다. - JVM Stack 영역
- 기본 자료형, 지역변수, 매개변수가 저장되는 메모리
- new 생성자 호출 시, 데이터의 참조값이 할당.
- 메소드가 호출될 때 메모리에 할당, 메서드 종료시 메모리에서 삭제
- 스레드 마다 Stack 영역 1개 씩 가진다.
§ Stack 영역 vs Heap 영역
public class StackHeap {
public static void main(String[] args) {
Person p = new Person();
int age = 25;
}
}
Stack | Heap | |
int age | 값 25 저장 | ❌ 없음 |
Person p | Person 객체의 참조값(주소) 저장 | new Person() 실제 객체 생성됨 |
□ Stack 영역과 - LIFO
public class Main {
public static void main(String[] args) {
main1();
}
static void main1() {
System.out.println("main1 start");
main2();
System.out.println("main1 end");
}
static void main2() {
System.out.println("main2 start");
System.out.println("main2 end");
}
}
[호출]
(1) 처음 자바 실행 시, main() 스택 프레임 생성
(2) method1() 호출 시, method1() 스택 프레임 생성
(3) method2() 호출 시, method2() 스택 프레임 생성
[종료]
(3) method2() 스택 프레임 제거 → method2()를 호출한 지점( method1() 스택프레임 )으로 돌아간다.
(2) method1() 스택 프레임 제어 → method1()을 호출한 지점( main() 스택 프레임 ) 으로 돌아간다
(1) main() 종료 → 더 이상 호출할 메서드가 없어 스택 프레임이 비워지며 자바 종료
- 자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다. - 메서드를 계속 호출하면 스택 프레임이 계속 쌓인다. - 지역 변수(매개변수 포함)는 스택 영역에서 관리한다. - 스택 프레임이 종료되면 지역 변수도 함께 제거된다. - 스택 프레임이 모두 제거되면 프로그램도 종료된다. |
□ 스택영역과 힙 영역 .... (이어서)