Java Heap과 Stack, JVM 동작 구조 복습 정리

Yunsung·2025년 7월 2일
post-thumbnail

Java를 공부하다 보면 Heap, Stack, JVM, GC 같은 용어를 자주 접하게 됩니다.
저도 처음에는 이 개념들이 잘 와닿지 않아 헷갈렸는데, 이번 기회에 정리하며 복습해 보았습니다.


1. Java 프로그램의 실행 흐름

먼저 Java 프로그램이 어떻게 실행되는지 큰 흐름부터 정리해 보았습니다.

1️⃣ 소스코드 (.java)

제가 작성한 Java 파일입니다.

2️⃣ 컴파일 → 바이트코드 (.class)

javac 명령어로 컴파일하면 JVM이 이해할 수 있는 바이트코드(.class) 로 변환됩니다.

3️⃣ JVM이 바이트코드를 실행

JVM이 바이트코드를 읽어 해석하거나, JIT(Just-In-Time) 컴파일러가 기계어로 변환하여 실행합니다.

4️⃣ 기계어 실행

최종적으로 CPU가 기계어를 실행하여 프로그램이 동작합니다.


2. JVM 메모리 구조

JVM은 Java 프로그램을 실행할 때 메모리를 다음과 같이 구분하여 사용합니다.

▫️ Method Area

  • 클래스의 메타 정보, static 변수, 상수 풀 등을 저장합니다.

▫️ Heap

  • 객체와 배열의 인스턴스 데이터가 저장되는 영역입니다.
  • 실행 중 동적으로 메모리를 할당합니다.
  • 참조가 끊긴 객체는 GC(Garbage Collector)가 수거합니다.

▫️ Stack

  • 메서드 호출 시 생성되는 스택 프레임, 지역 변수, 참조값, 매개변수 등이 저장됩니다.
  • 메서드가 종료되면 해당 스택 프레임이 사라지면서 자동으로 정리됩니다.
  • LIFO(Last-In-First-Out) 구조입니다.

3. Stack의 특징

✅ 빠르게 동작하며 자동으로 메모리를 관리합니다.
✅ 지역 변수, 참조값을 저장합니다.
✅ 메서드가 종료되면 자동으로 정리됩니다.

예시

int a = 10; // a의 값(10)은 Stack에 저장됩니다.

4. Heap의 특징

✅ 동적으로 크기를 할당할 수 있어 유연합니다.
✅ 객체와 배열 데이터를 저장합니다.
✅ GC가 참조가 끊긴 객체를 자동으로 수거합니다.

예시

String s = new String("hello");
// s는 Stack에 Heap의 주소(reference)를 저장하고,
// "hello" 객체는 Heap에 저장됩니다.

5. 왜 Stack과 Heap으로 나누어 사용하는가?

처음에는 이유가 헷갈렸는데, 정리해 보니 아래와 같습니다.

  • Stack은 메서드 호출 시 지역 변수 관리에 적합하고 속도가 빠릅니다.
  • Heap은 크기가 유동적인 객체와 배열 데이터를 저장하고 관리하기 위해 사용합니다.
  • 이처럼 구분하여 사용함으로써 속도(성능)와 유연성을 모두 확보할 수 있습니다.

6. Garbage Collector (GC)

Heap 영역에 저장된 객체는 참조가 끊어지면 GC(Garbage Collector) 가 자동으로 수거해 줍니다.
따라서 개발자가 메모리를 직접 해제할 필요 없이 편리하게 관리할 수 있습니다.

다만 GC가 동작할 때 프로그램이 잠시 멈추는(STW, Stop The World) 현상이 발생할 수 있어, 필요 이상의 객체 생성을 지양하는 것이 좋습니다.


마무리

  • Heap은 객체 데이터, Stack은 지역 변수와 참조값을 저장한다.
  • JVM은 바이트코드를 읽어 기계어로 변환해 프로그램을 실행한다.
  • GC가 참조가 끊긴 객체를 자동으로 수거해 주어 메모리 관리가 용이하다.
profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글