본문 바로가기
Java

[Java] Java의 키워드들과 JVM 메모리 영역의 관계 정리

by clolee 2025. 4. 8.

Java의 키워드들(static, final, 변수, 메서드 등)와 JVM 메모리 영역(Stack/Heap/Method Area)과의 관계

✅ Java의 키워드들과 JVM 메모리 영역의 관계 정리


📚 1. JVM 메모리 구조 요약

자바 프로그램이 실행되면, JVM(Java Virtual Machine)은 내부적으로 다음과 같은 메모리 영역을 구성하여 클래스 정보, 객체, 메서드 호출 정보 등을 저장하고 관리합니다.

┌──────────────────────────┐
│      Method Area         │ ← 클래스 정보, static 변수, static 메서드, 상수 풀 등
├──────────────────────────┤
│      Heap Area           │ ← 객체(instance), 인스턴스 변수
├──────────────────────────┤
│      Stack Area          │ ← 메서드 호출 시 사용하는 지역 변수, 매개변수, 연산 중 임시값
├──────────────────────────┤
│      PC Register         │ ← 쓰레드별 현재 명령어 위치 저장
├──────────────────────────┤
│  Native Method Stack     │ ← 자바 외 C 등의 네이티브 메서드 호출 시 사용
└──────────────────────────┘

실무에서 가장 자주 다루게 되는 영역은 Method Area, Heap, Stack입니다.


🔎 2. 메모리 영역별 역할 정리

메모리 영역  저장하는 내용  생성 시점  소멸 시점  예시
Method Area 클래스 정보, static 변수/메서드, 상수 클래스 로딩 시 JVM 종료 시 static int x, public static void main()
Heap new로 생성된 객체, 인스턴스 변수 객체 생성 시 참조 해제 후 GC new Person(), p.name
Stack 지역 변수, 매개변수, 호출 스택 프레임 메서드 호출 시 메서드 종료 시 int i = 0, String msg

✅ 3. Java 키워드와 JVM 메모리 영역 관계

1️⃣ static → Method Area

class MyClass {
    static int count = 0;
}
  • count는 객체별로 따로 존재하지 않고, 클래스당 하나의 저장공간만 존재.
  • 클래스가 JVM에 처음 로딩될 때 Method Area에 1회만 생성됨.
  • → 클래스 객체가 생성되는 것이 아니라 클래스 "정보 자체"가 올라감
  • 객체를 생성(new MyClass() )하지 않아도 MyClass.count 로 접근 가능.

2️⃣ 인스턴스 변수 → Heap 영역

class Person {
    String name; // 인스턴스 변수
}
Person p = new Person(); // new Person()은 Heap에 저장
  • p 객체와 그 안의 name 필드는 모두 Heap에 저장됨.
  • 객체마다 독립된 인스턴스 변수를 가짐.

3️⃣ 지역 변수, 매개변수 → Stack 영역

void greet(String message) {
    int count = 0;
}
  • message, count는 메서드 호출 시 Stack Frame에 저장됨.
  • 메서드 실행 종료 시 자동으로 소멸됨.

4️⃣ final 키워드 → 메모리 위치가 아니라 값 변경 금지와 관련

final int localMax = 10;            // Stack에 저장됨 (지역 변수)
public static final int MAX = 100;  // Method Area에 저장됨 (상수)
  • final은 값을 재할당할 수 없도록 제한하는 키워드일 뿐, 메모리 위치를 결정하지 않음.
  • 저장 위치는 변수의 종류(static, 지역, 인스턴스)에 따라 결정됨.
  • static final의 경우: Method Area에 상수처럼 올라감

🔥 4. 요약 정리표: 키워드별 저장 위치

항목  예시  저장 영역  특징
static 변수 static int count; Method Area 클래스 로딩 시 1회 생성
final 변수 final int x = 10; Stack(지역) 또는 Heap(필드) 값 재할당 불가
인스턴스 변수 String name; Heap 객체마다 별도 존재
지역 변수 int i = 0; Stack 메서드 종료 시 소멸
매개변수 void m(int x) Stack 메서드 호출 시 스택 프레임 생성
static 메서드 static void f() Method Area 객체 없이 호출 가능
인스턴스 메서드 void run() Method Area(코드), Stack(호출 시) 객체 필요

 


🧠 5. 비유로 이해하기

영역  비유
Method Area 클래스의 설계도면이 저장된 기계 도면실 (static, 코드, 상수 등 정적 자원 저장)
Heap 객체가 실제로 만들어지는 공장 창고 (인스턴스 변수 등)
Stack 작업 중인 정보를 담아두는 작업자의 메모장 (지역 변수, 매개변수 등)

❗ 6. 자주 혼동되는 오해 vs 진실

오해 진실
static 변수는 객체 생성 시 메모리에 올라간다 ❌ 클래스 로딩 시 Method Area에 올라감
static 메서드는 객체를 생성해야 호출할 수 있다 ❌ 객체 없이 클래스명으로 직접 호출 가능
final은 메모리 구조와 관련 있다 ❌ 메모리 위치가 아니라 값의 재할당 금지 의미

 


✅ 7. 예시 코드로 메모리 위치 표시

public class Student {
    static String schoolName = "KHS"; // Method Area

    String name; // Heap
    int age;     // Heap

    public static void main(String[] args) {
        int localNum = 100;         // Stack
        Student s = new Student();  // s → Stack (참조), new Student() → Heap
        s.name = "Tom";             // Heap
        s.age = 17;                 // Heap
    }

    public static void staticMethod() {
        // Method Area에 저장됨
    }

    public void instanceMethod() {
        // 메서드 코드는 Method Area에 있으나,
        // 호출 시 지역 변수는 Stack, 인스턴스 필드는 Heap
    }
}

✅ 8. static 변수/메서드가 메모리에 올라가는 시점은?

  • 클래스가 처음 로딩될 때
  • JVM이 MyClass.count 또는 MyClass.staticMethod() 와 같이 클래스 이름으로 접근하는 순간(해당 클래스를 사용하는 순간),
  • Method Area에 클래스 정보 + static 필드/메서드가 올라감 (1번만)
System.out.println(MyClass.count); // 클래스가 로딩되며 static 요소들 Method Area에 올라감

✔️ new 연산으로 객체 인스턴스를 생성하지 않아도,

→ 클래스 로딩이 발생하고, static 요소들이 Method Area에 올라갑니다.

 

 

댓글