자바/자바

(자바)JVM, 클래스 로딩, 런타임 메모리 구조 정리 *널널한 개발자

불광동 물주먹 2025. 9. 9. 01:04

JVM, 클래스 로딩, 런타임 메모리 구조 정리

1. 자바와 OS, 그리고 VM

  • C/C++ 프로그램은 OS와 직접적으로 맞닿아 실행됩니다. → OS 종속적.
  • Java 프로그램은 .java → .class 로 컴파일된 뒤, JVM 위에서 실행됩니다.
  • VM(Virtual Machine) 은 원래 CPU(하드웨어)가 해야 할 역할을 소프트웨어적으로 흉내내는 것.
    • 예: JVM(Java Virtual Machine)
  • 덕분에 자바는 OS나 하드웨어에 직접 접근하지 않고, JVM을 통해 안전하게 동작합니다.

2. 자바 실행 과정

  1. .java 소스 파일 작성
  2. javac 컴파일러 → .class (바이트코드, 16진수 형태)
  3. JVM이 .class 로드
    • 인터프리터가 바이트코드를 한 줄씩 실행
    • JIT 컴파일러가 자주 실행되는 코드를 기계어로 변환 후 캐싱 (성능 최적화)
  4. CPU에서 기계어 실행

➡ 자바는 인터프리터와 JIT을 혼합한 하이브리드 언어입니다.


3. 클래스 로더(ClassLoader)

클래스로더는 JVM의 핵심 구성 요소 중 하나로, 필요한 클래스를 런타임에 동적으로 메모리에 로드합니다.

주요 클래스 로더

  • 부트스트랩 클래스 로더: 가장 기본적인 JVM 라이브러리(java.base 등)를 로드
  • 플랫폼 클래스 로더: SQL, XML 등 플랫폼 수준의 라이브러리 로드
  • 어플리케이션 클래스 로더: 사용자가 작성한 클래스, JAR 등 로드

동작 과정

  • 클래스 로딩 시점에 링킹(검증, 준비, 해석) 과정을 거침
  • 필요할 때만 로드하는 동적 로딩을 사용 → 메모리 효율성 향상

4. 클래스 로딩과 링킹

  • 링킹(Linking): 클래스 파일을 실제로 실행할 수 있도록 연결하는 과정
    • 검증(Verification): JVM 명세에 맞는지, 보안 위협이 없는지 확인
    • 준비(Preparation): static 변수 메모리 할당 및 초기화 (기본값 0)
    • 해석(Resolution): 심볼릭 참조를 실제 메모리 주소로 치환

실행 중에도 로딩/링킹이 발생할까?

  • 네, 클래스는 필요할 때(load-on-demand) 동적으로 로딩됩니다.
  • 실행 도중에도 새로운 클래스가 로드/링크될 수 있으며, 이것이 자바의 유연성과 동시에 성능 이슈 가능성도 존재합니다.
    -> 리플렉션 혹은 new 인스턴스 클래스 생성 후 호출되면 로딩+링킹 

5. JVM과 보안

  • 자바는 JVM이라는 가상환경 안에서 실행되므로, 하드웨어 손상을 입힐 가능성이 매우 낮습니다.
  • JVM이 일종의 보호막 역할을 하여 메모리 관리와 보안 위협을 제어합니다.
  • 단, JNI(Java Native Interface) 를 사용하면 C/C++ 코드와 직접 연결 가능 → 이 경우 OS 자원에 직접 접근하므로 보안 취약점이 생길 수 있습니다.
    • 예: 파일 I/O, 네트워크 호출

6. Spring DI와 객체 저장 위치

  • 스프링의 DI(의존성 주입)는 컨테이너가 객체 인스턴스를 관리하는 개념입니다.
  • 이 객체들은 JVM의 Heap 영역에 생성되어 관리됩니다.
  • Metaspace 는 클래스의 “정의 정보(메타데이터)”만 저장할 뿐, 실제 객체는 Heap에만 존재합니다.
    ➡ DI 컨테이너가 관리하는 빈(bean)들도 결국 Heap에 올라와 있는 객체들입니다.

7. 자바 런타임 데이터 영역 (Runtime Data Areas)

JVM은 실행 시 아래와 같은 메모리 구조를 가집니다.

1) 메소드 영역 (Metaspace)

  • 클래스 메타데이터, static 변수, 런타임 상수 풀 저장
  • 클래스 로더에 의해 관리됨

2) Heap

  • 인스턴스(객체) 저장
  • GC(Garbage Collector)가 관리

3) 스택(Stack)

  • 각 스레드마다 독립적으로 생성
  • 지역변수 테이블, 피연산자 스택, 메서드 반환값 등이 저장됨
  • 메서드 호출 시마다 프레임(Frame)이 쌓였다가 종료 시 제거

4) 네이티브 메서드 스택

  • JNI 등을 통해 호출되는 네이티브 메서드 실행용

5) PC Register

  • 현재 실행 중인 JVM 명령의 주소를 저장

8. 정리

  • 자바는 OS/하드웨어 위에서 직접 동작하지 않고, JVM이라는 가상환경을 통해 안전하게 실행된다.
  • .class 파일은 클래스 로더에 의해 필요할 때 로드되고, 검증과 링킹을 거쳐 실행된다.
  • JIT 컴파일러는 성능 최적화를 위해 자주 쓰이는 바이트코드를 기계어로 변환해 캐싱한다.
  • 스프링의 DI 객체, 일반 인스턴스 모두 Heap에 존재한다. Metaspace에는 클래스 정의 정보만 있다.
  • JVM의 런타임 데이터 영역(Heap, Stack, Metaspace 등)을 이해하는 것은 자바 메모리 모델을 이해하는 기초다.