
우리가 자바에서 무심코 작성하는
int a = 10;
User user = new User();
겉보기엔 비슷해 보이지만, 컴퓨터 내부에서는 완전히 다른 세상에서 살고 있는 녀석들입니다.
이 둘이 메모리의 '어디'에 저장되는지 모르면, 나중에 이런 에러를 만났을 때 멍하니 모니터만 바라보게 됩니다.
오늘은 백엔드 개발자가 꼭 알아야 할 JVM의 3대장, Method, Stack, Heap 영역을 아주 쉽게 털어보겠습니다.
JVM(자바 가상 머신)의 메모리 구조는 복잡하지만, 실무에서는 딱 3가지만 기억하면 됩니다.
Method Area (메서드 영역): 붕어빵 틀 (설계도)
Stack Area (스택 영역): 잠깐 쓰는 작업실
Heap Area (힙 영역): 거대한 창고
면접관이 "스택과 힙의 차이가 뭐죠?"라고 묻는다면, 아래 내용을 머릿속에 그리고 대답하면 됩니다.
📍 Stack (스택)
특징: LIFO(Last In First Out) 구조입니다. 메서드가 호출되면 프레임이 쌓이고, 끝나면 바로 사라집니다.
누가 사나요?
- 기본형 변수(Primitive Type): int, double, boolean 등 실제 값(10, 3.14, true)이 여기에 바로 저장됩니다.
- 참조형 변수(Reference Type)의 '주소값': 객체를 가리키는 리모컨만 저장됩니다.
📍 Heap (힙)
특징: 자유롭게 데이터를 저장하는 거대한 공간입니다. Garbage Collector(GC) 라는 청소부가 주기적으로 안 쓰는 데이터를 지워줍니다.
누가 사나요?
- 참조형(Reference Type) 데이터: new 명령어로 만든 모든 객체, 배열(Array), String 등이 여기에 저장됩니다.

백문이 불여일견, 코드를 보면서 메모리에 어떻게 쌓이는지 추적해 봅시다.
public class Main {
public static void main(String[] args) {
int age = 25; // 1. Stack에 저장
String name = "BugStar"; // 2. Stack엔 주소, Heap엔 "BugStar" 객체
User user = new User(); // 3. Stack엔 user(리모컨), Heap엔 User 객체
}
}
이 코드가 실행될 때 일어나는 일:
int age = 25;
User user = new User();
💡 핵심 포인트: 스택에 있는 user 변수는 힙에 있는 실제 객체를 가리키는 '리모컨'일 뿐입니다!
기술 면접에서 자주 나오는 질문에 대한 모범 답안입니다.
A. "Stack은 메서드 호출 시 지역 변수나 매개변수가 저장되는 임시 공간으로, 메서드가 종료되면 데이터가 즉시 소멸됩니다. 반면, Heap은 new 연산자로 생성된 객체가 저장되는 공간이며, 개발자가 직접 지우지 않고 Garbage Collector(GC)에 의해 관리됩니다."
A. "주로 재귀 함수가 종료 조건 없이 무한 호출되어, Stack 메모리 영역이 꽉 찼을 때 발생합니다."
A. 맞습니다. 그래서 자바에는 아주 부지런한 청소부, GC(Garbage Collector)가 존재합니다. 다음 시간에는 개발자가 몰라도 알아서 메모리를 정리해 주는 GC의 동작 원리에 대해 아주 쉽게 알아보겠습니다.
[Java] 개발자가 메모리 관리를 안 해도 되는 이유 (GC의 원리)