자바 애플리케이션을 실행할 때, JVM(Java Virtual Machine)은 메모리를 관리하는 두 가지 주요 영역인 Stack과 Heap을 사용합니다. 이 두 영역은 자바 프로그램의 실행 및 성능에 큰 영향을 미치기 때문에, 이들 각각의 역할과 동작 방식을 이해하는 것이 중요합니다.
JVM Stack은 각 스레드가 실행될 때 사용되는 메모리 영역입니다. 스택은 메소드 호출과 관련된 정보를 저장하는 데 사용됩니다.
StackOverflowError가 발생합니다.public class StackExample {
public static void main(String[] args) {
methodA();
}
public static void methodA() {
methodB();
}
public static void methodB() {
// 메소드 호출에 따른 스택 프레임 생성
}
}
위의 예시에서 methodA와 methodB의 호출이 스택에 저장되며, 각 메소드 호출 시 새로운 스택 프레임이 생성됩니다.
JVM Heap은 자바 객체와 배열이 저장되는 메모리 영역입니다. 모든 자바 객체는 힙 메모리에 할당되며, 가비지 컬렉터가 메모리를 관리합니다.
public class HeapExample {
public static void main(String[] args) {
MyObject obj = new MyObject();
}
}
class MyObject {
int value;
public MyObject() {
this.value = 10;
}
}
위의 예시에서 MyObject 클래스의 인스턴스는 힙 메모리에 할당됩니다. obj 변수는 힙에 저장된 객체를 참조하게 됩니다.
| Feature | Stack | Heap |
|---|---|---|
| 용도 | 메소드 호출 및 로컬 변수 저장 | 자바 객체 및 배열 저장 |
| 메모리 구조 | LIFO (Last In, First Out) | 동적 할당, 자동 관리 |
| 메모리 크기 | 정적 크기 | 조절 가능 (-Xms, -Xmx 옵션) |
| 스레드 | 스레드 별로 독립적 | 모든 스레드 간 공유 |
JVM Stack과 Heap은 자바 프로그램의 메모리 관리에서 핵심적인 역할을 합니다. Stack은 메소드 호출과 로컬 변수를 관리하고, Heap은 자바 객체를 저장합니다. 각 영역의 특성을 이해함으로써 메모리 관리와 성능 최적화에 도움을 줄 수 있습니다.
자바 애플리케이션을 개발할 때, Stack과 Heap의 작동 방식을 잘 이해하는 것이 중요하며, 이를 통해 보다 효율적이고 안정적인 애플리케이션을 개발할 수 있습니다.