Java를 공부하다 보면 Heap, Stack, JVM, GC 같은 용어를 자주 접하게 됩니다.
저도 처음에는 이 개념들이 잘 와닿지 않아 헷갈렸는데, 이번 기회에 정리하며 복습해 보았습니다.
먼저 Java 프로그램이 어떻게 실행되는지 큰 흐름부터 정리해 보았습니다.
제가 작성한 Java 파일입니다.
javac 명령어로 컴파일하면 JVM이 이해할 수 있는 바이트코드(.class) 로 변환됩니다.
JVM이 바이트코드를 읽어 해석하거나, JIT(Just-In-Time) 컴파일러가 기계어로 변환하여 실행합니다.
최종적으로 CPU가 기계어를 실행하여 프로그램이 동작합니다.
JVM은 Java 프로그램을 실행할 때 메모리를 다음과 같이 구분하여 사용합니다.
✅ 빠르게 동작하며 자동으로 메모리를 관리합니다.
✅ 지역 변수, 참조값을 저장합니다.
✅ 메서드가 종료되면 자동으로 정리됩니다.
int a = 10; // a의 값(10)은 Stack에 저장됩니다.
✅ 동적으로 크기를 할당할 수 있어 유연합니다.
✅ 객체와 배열 데이터를 저장합니다.
✅ GC가 참조가 끊긴 객체를 자동으로 수거합니다.
String s = new String("hello");
// s는 Stack에 Heap의 주소(reference)를 저장하고,
// "hello" 객체는 Heap에 저장됩니다.
처음에는 이유가 헷갈렸는데, 정리해 보니 아래와 같습니다.
Heap 영역에 저장된 객체는 참조가 끊어지면 GC(Garbage Collector) 가 자동으로 수거해 줍니다.
따라서 개발자가 메모리를 직접 해제할 필요 없이 편리하게 관리할 수 있습니다.
다만 GC가 동작할 때 프로그램이 잠시 멈추는(STW, Stop The World) 현상이 발생할 수 있어, 필요 이상의 객체 생성을 지양하는 것이 좋습니다.