1. Static 메모리
Static 메모리는 Java에서 정적 변수와 클래스 변수가 저장되는 메모리 영역입니다.
- 특징:
static
키워드로 선언된 변수와 메서드는 프로그램이 시작될 때 메모리에 로드됩니다.- 클래스 로더에 의해 메모리 할당이 이루어지며, 프로그램 종료 시까지 유지됩니다.
- 모든 객체가 공유하며, 하나의 고정된 메모리 위치를 가집니다.
- 사용 예:
class Example {
static int staticVar = 10; // Static 메모리에 저장
static void staticMethod() {
System.out.println("Static method called");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Example.staticVar); // staticVar는 모든 객체가 공유
Example.staticMethod(); // staticMethod는 클래스 차원에서 호출 가능
}
}
staticVar
와 staticMethod
는 Example
클래스의 모든 인스턴스가 공유하는 정적 변수와 메서드로, JVM이 시작할 때 메모리에 로드됩니다.2. Heap 메모리
Heap 메모리는 Java에서 동적으로 할당되는 객체와 인스턴스 변수들이 저장되는 메모리 영역입니다.
- 특징:
new
키워드를 사용하여 생성된 모든 객체는 Heap에 할당됩니다.- 객체는 가비지 컬렉터(Garbage Collector)에 의해 관리되며, 더 이상 참조되지 않는 객체는 자동으로 메모리에서 해제됩니다.
- 모든 인스턴스 변수들은 Heap에 저장됩니다.
- 사용 예:
class Person {
String name; // 인스턴스 변수는 Heap에 저장됨
Person(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("John"); // Heap 메모리에 Person 객체가 생성됨
System.out.println(person.name);
}
}
person
객체는 Heap 메모리에 생성되며, name
인스턴스 변수도 Heap에 저장됩니다.3. Stack 메모리
Stack 메모리는 Java에서 메서드 호출 시 생성되는 지역 변수와 메서드 호출 스택 프레임이 저장되는 메모리 영역입니다.
- 특징:
- 메서드가 호출될 때마다 메서드의 지역 변수와 매개변수가 스택에 저장됩니다.
- 메서드 호출이 끝나면 해당 메서드의 스택 프레임이 제거되고, 그 안에 있는 변수들도 함께 사라집니다.
- 빠르고 효율적이지만, 스택 오버플로우(Stack Overflow) 위험이 존재합니다. 이는 재귀 호출이 지나치게 깊어질 때 발생할 수 있습니다.
- 사용 예:
public class Main {
public static void main(String[] args) {
int localVar = 5; // Stack 메모리에 저장됨
Main main = new Main();
main.methodA();
}
void methodA() {
int anotherVar = 10; // Stack 메모리에 저장됨
methodB();
}
void methodB() {
int yetAnotherVar = 15; // Stack 메모리에 저장됨
}
}
localVar
, anotherVar
, yetAnotherVar
는 각각 main
, methodA
, methodB
메서드의 호출 시 스택에 저장됩니다. 메서드가 종료되면 해당 변수들은 스택에서 제거됩니다.요약
- Static 메모리: 클래스 변수와 정적 메서드가 저장되는 공간으로, 프로그램이 시작될 때부터 종료될 때까지 유지됩니다.
- Heap 메모리: 동적으로 생성된 객체와 인스턴스 변수가 저장되는 공간으로, 가비지 컬렉터에 의해 관리됩니다.
- Stack 메모리: 메서드 호출 시 생성되는 지역 변수와 메서드 호출 정보가 저장되는 공간으로, 메서드가 종료되면 자동으로 해제됩니다.
이 세 가지 메모리 영역은 Java 프로그램에서 데이터가 어떻게 관리되는지 이해하는 데 필수적이며, 효율적인 메모리 사용을 위해 각각의 특성을 잘 이해하고 활용하는 것이 중요합니다.
Share article