⚛️ 리액트 개발 환경 세팅: CRA vs Vite

⚛️ 리액트 개발 환경 세팅: CRA vs Vite

자바 성능의 핵심, JVM 메모리와 GC의 비밀 ☕

자바로 프로그래밍을 하다 보면 "메모리 누수(Memory Leak)"라던가 "애플리케이션이 멈췄다"는 이야기를 종종 듣게 됩니다.
우리가 작성한 코드는 컴퓨터 내부에서 정확히 어떻게 저장되고 실행되는 것일까요?
자바가 운영체제와 상관없이 어디서든 실행될 수 있는 이유는 바로 JVM(Java Virtual Machine) 덕분입니다.
하지만 이 JVM 내부를 모른다면 효율적인 프로그램을 짤 수 없습니다.
오늘은 자바 개발자라면 반드시 알아야 할 JVM의 메모리 구조와, 자동으로 메모리를 청소해 주는 가비지 컬렉션(GC)의 마법 같은 원리를 아주 쉽게 파헤쳐 보겠습니다.

🧩 1. JVM(Java Virtual Machine)이란 무엇인가?

JVM은 직역하면 '자바 가상 머신'입니다.
우리가 작성한 자바 코드(.java)를 컴파일하면 바이트코드(.class)가 되는데, 이 코드를 운영체제가 이해할 수 있도록 해석하고 실행해 주는 '가상의 컴퓨터' 역할을 합니다.

Diagram of JVM Architecture

💡 JVM의 핵심 역할 3가지

  • 클래스 로더(Class Loader): 바이트코드를 읽어 메모리에 적재합니다.
  • 실행 엔진(Execution Engine): 적재된 코드를 해석하고 실행합니다.
  • 런타임 데이터 영역(Runtime Data Area): 프로그램 실행에 필요한 메모리를 할당받는 곳입니다.

오늘 우리가 집중해서 살펴볼 곳은 바로 데이터를 저장하는 창고, '런타임 데이터 영역(메모리)'입니다.


🏗️ 2. JVM 메모리 구조 (Runtime Data Area)

JVM의 메모리는 효율적인 관리를 위해 크게 5가지 영역으로 나뉩니다.
이 중 가장 중요한 곳은 Stack(스택)Heap(힙) 영역입니다.

📦 Heap Area (힙 영역)

- 객체(Instance)와 배열이 생성되는 공간입니다.
- 모든 스레드가 공유하는 공용 공간입니다.
- GC(가비지 컬렉션)의 주요 대상이 되는 곳입니다.
- 프로그램 실행 중 생성된 데이터들이 이곳에 쌓입니다.

📚 Stack Area (스택 영역)

- 메서드 호출 시 생성되는 지역 변수, 매개 변수가 저장됩니다.
- 메서드가 종료되면 즉시 메모리에서 사라집니다.
- 각 스레드마다 별도로 생성되는 사적인 공간입니다.
- Heap 영역에 있는 객체의 주소값(참조값)을 가집니다.


🔍 Stack vs Heap 한눈에 비교

구분 Stack 영역 Heap 영역
저장 데이터 기본 타입 변수, 참조 변수 객체(new), 배열
생명 주기 메서드 호출 ~ 종료 GC가 수거할 때까지
스레드 공유 공유 안 함 (독립적) 모든 스레드 공유

이 외에도 클래스 정보를 담는 Method Area, 현재 실행 명령을 가리키는 PC Register 등이 존재하지만, 일반적인 개발 상황에서는 Stack과 Heap의 관계를 이해하는 것이 최우선입니다.


♻️ 3. 가비지 컬렉션 (Runtime Data Area)

C언어 같은 언어는 개발자가 메모리를 직접 할당(`malloc`)하고 해제(`free`)해야 했습니다.
하지만 자바는 가비지 컬렉터(Garbage Collector)라는 청소부가 있어서, 더 이상 사용되지 않는 객체를 자동으로 찾아내어 메모리를 회수합니다.

Reachability in Garbage Collection

🛠️ GC의 동작 원리: Stop The World

⚠️ Stop The World란?

GC가 실행될 때, GC를 실행하는 스레드를 제외한 모든 애플리케이션 스레드가 멈추는 현상을 말합니다.
어떤 훌륭한 GC 알고리즘도 이 멈춤 현상을 완전히 없앨 수는 없습니다.
따라서 GC 튜닝의 목표는 이 '멈춤 시간'을 줄이는 것입니다.

🔄 Heap 영역의 구분: Young & Old

효율적인 청소를 위해 Heap 영역은 물리적으로 두 공간으로 나뉩니다.
객체는 생성된 지 얼마나 되었느냐에 따라 다른 곳에 저장됩니다.

JVM Heap Memory Structure
  • 1. Young Generation (젊은 영역)
    - 새롭게 생성된 객체가 위치합니다.
    - 여기서 일어나는 GC를 Minor GC라고 부릅니다.
    - 대부분의 객체는 금방 사용되지 않게 되므로(Unreachable), 많은 객체가 여기서 사라집니다.
  • 2. Old Generation (늙은 영역)
    - Young 영역에서 오랫동안 살아남은 객체가 이동(Promotion)해 오는 곳입니다.
    - 크기가 크며, 여기서 일어나는 GC를 Major GC(또는 Full GC)라고 부릅니다.
    - Full GC는 시간이 오래 걸리므로 성능에 큰 영향을 줍니다.

✨ 요약 및 정리

1. JVM은 자바 코드를 실행하는 가상 컴퓨터이며, 메모리 관리의 주체입니다.
2. 메모리는 주로 Stack(메서드, 변수)Heap(객체)으로 관리됩니다.
3. GC는 Heap 영역에서 사용하지 않는 객체를 자동으로 삭제합니다.
4. GC 과정에서 애플리케이션이 멈추는 Stop-the-World가 발생하므로, 이를 최적화하는 것이 성능 개선의 핵심입니다.

메모리 구조를 이해했다면, 이제 더 효율적인 코드를 작성할 준비가 되셨습니다!
불필요한 객체 생성을 줄이고, 유효 범위를 적절히 관리해보세요.

댓글 쓰기