자바에서 프로그램이 실행될 때, JVM(Java Virtual Machine)은 메모리를 효율적으로 관리하기 위해 메모리를 여러 영역으로 나눈다. 각 영역에는 특정한 역할이 있으며, 자바의 변수와 객체가 어떻게 저장되고 관리되는지에 따라 그 위치가 달라진다.
자바 메모리 구조의 4가지 영역
1. 메서드 영역 (Method Area)
메서드 영역에는 클래스와 인터페이스의 바이트 코드가 처음 로드될 때 저장된다. 이곳은 모든 객체가 공유하는 영역으로, 클래스와 관련된 정보를 포함하며 주로 정적 데이터가 저장된다.
정적 멤버 | static으로 선언된 변수와 메서드 |
클래스 정보 | 클래스명, 메서드와 변수 선언 등 클래스 관련 메타데이터 |
상수 풀(Constant Pool) | 문자열 리터럴 같은 상수 값들이 저장되는 공간 |
2. 힙 영역 (Heap Area)
힙 영역은 프로그램 실행 중에 동적으로 생성된 객체들이 저장되는 공간이다. new 키워드를 사용해 생성된 모든 인스턴스 객체는 힙에 저장되며, 이 메모리 공간은 프로그램의 모든 스레드가 공유한다. 힙 영역의 객체는 가비지 컬렉터(Garbage Collector)에 의해 관리된다. 가비지 컬렉터(Garbage Collector)는 힙 영역에서 더 이상 참조되지 않는 객체를 찾아 메모리를 해제한다.
인스턴스 객체 | new 키워드로 생성된 클래스 인스턴스 |
배열 | new로 생성된 배열 객체 |
3. 스택 영역 (Stack Area)
스택 영역은 각 메서드가 실행될 때 생성되는 임시 데이터를 저장한다. 스택 영역은 각 스레드마다 독립적으로 존재하며, 메서드가 호출될 때마다 새로운 메서드 프레임이 생성되고 메서드가 종료되면 해당 프레임이 스택에서 제거된다.
지역 변수 | 메서드 안에서 선언된 변수는 스택에 저장되며, 메서드 실행이 끝나면 메모리에서 자동으로 해제된다. |
객체 참조 변수 | 힙에 생성된 객체를 가리키는 참조 변수도 스택에 위치한다. |
4. PC 레지스터(Program Counter Register)와 네이티브 메서드 스택 (Native Method Stack)
이 두 영역은 JVM 내부에서 스레드 간의 명령 처리를 지원하는 역할을 한다.
PC 레지스터 | 각 스레드는 자신만의 PC 레지스터를 가지며, 현재 실행 중인 명령어의 주소를 추적한다. |
네이티브 메서드 스택 | 자바가 아닌 네이티브 코드(C/C++ 등)를 실행할 때 사용하는 스택이다. 자바 프로그램에서 JVM 외부의 네이티브 메서드를 호출할 때 필요한 데이터가 여기에 저장된다. |
예시로 이해하는 메모리 구조
class Dog {
static int count = 0; //정적 변수
String name;
Dog(String name) { //생성자
this.name = name;
count++;
}
}
public class Main {
public static void main(String[] args) {
Dog obj = new Dog("happy");
}
}
1. 스택 영역
Dog obj = new Dog("happy"); 코드가 실행되면 obj라는 참조 변수가 스택에 저장된다. 스택은 메서드가 호출될 때마다 쌓이고, 메서드가 끝나면 자동으로 해제되는 영역이다. obj는 힙에 생성된 Dog 객체를 참조하는 역할을 한다.
2. 힙 영역
new Dog("happy");는 새로운 Dog 객체를 힙에 생성한다. 힙 영역은 인스턴스가 저장되는 공간으로, Dog 클래스의 속성인 name과 count를 가지고 있는 Dog 객체가 힙에 생성된다. 이 공간은 프로그램이 실행되는 동안 필요할 때 동적으로 할당되며, 가비지 컬렉터가 관리한다.
3. 메서드 영역과 정적 멤버
Dog 클래스의 static int count;는 정적 변수이다. 정적 변수는 클래스 레벨에서 관리되므로, 객체와 상관없이 오직 하나만 존재하며, 모든 Dog 객체가 공유하는 값이다. count 변수는 메서드 영역에 저장된다. 모든 Dog 객체가 생성될 때마다 count 값이 증가하기 때문에, 프로그램이 실행 중일 때 count는 항상 같은 메모리 위치에 있다.
요약
스택 영역: 메서드 내부의 지역 변수나 참조 변수가 저장된다.
힙 영역: new 키워드로 생성된 인스턴스 객체가 저장된다.
메서드 영역: 클래스 로딩 시 클래스와 정적 멤버(정적 변수, 정적 메서드) 정보가 저장된다.
'Language > JAVA' 카테고리의 다른 글
[JAVA]List, Set, Map 컬렉션(Collection) (2) | 2024.11.24 |
---|---|
[JAVA]method 종류 (0) | 2024.11.20 |
[JAVA]정적 메소드에서 this를 사용할 수 없는 이유 (2) | 2024.11.03 |
[JAVA]Runnable 인터페이스를 구현해서 스레드를 만드는 이유 (0) | 2024.09.28 |
[JAVA]예외(Exception) vs 에러(Error) (0) | 2024.09.21 |