static, heap, stack 메모리 영역

허성재's avatar
Aug 13, 2024
static, heap, stack 메모리 영역
 

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는 클래스 차원에서 호출 가능 } }
    • 여기서 staticVarstaticMethodExample 클래스의 모든 인스턴스가 공유하는 정적 변수와 메서드로, 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

heo-gom