[Java 기본 원리] JVM의 동작 원리와 메모리 구조 총정리

JVM(=Java Virtual Machine)은 자바 프로그램의 실행 환경을 제공하는 가상 머신으로, 플랫폼 독립성과 자동 메모리 관리(GC)를 지원한다. JVM의 핵심 컴포넌트는 클래스 로더, 메모리 영역, 실행 엔진, JNI 이다.



JVM의 기본 구조 💡

핵심 컴포넌트: 클래스 로더, 메모리 영역, 실행 엔진, JNI

클래스 로더가 컴파일 된 자바 바이트 코드를 메모리 영역에 로드하고, 실행 엔진이 자바 바이트 코드를 실행
JNI(Java Native Interface)는 네이티브 응용 프로그램(하드웨어와 운영 체제 플랫폼에 종속된 프로그램들) C, C++, 어셈블리 같은 다른 언어들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크

JVM구조도



JVM 메모리 구조 - 기본 🔍

크게 3가지 영역

  1. Static 영역 (Method Area)
    • 저장 데이터: 전역변수, static 데이터
    • 생명주기: 프로그램 시작~종료까지 유지
  2. Stack 영역
    • 저장 데이터: 메서드 내 정의하는 기본자료형, 지역변수, 리턴값 등
    • 생명주기: 메서드 생명주기와 동일
  3. Heap 영역
    • 저장 데이터: new로 생성된 객체, 배열 등 인스턴스
    • 생명주기: new 시점에 생성, GC에 의해 자동 해제


Heap vs Stack 크기 결정 시점은?

  • 스택은 정적메모리를 사용하여 컴파일 시 크기가 결정
  • 힙은 동적메모리를 사용하여 런타임 시 크기를 결정



JVM 메모리 구조 - 심화 ⚡

메모리 영역(Runtime Data Area) 크게 5가지 영역

  1. Static 영역 (Method Area=Metaspace)

    참고: 메소드 영역(Java~7) → 메타스페이스 영역(Java8~)
    Metaspace는 간단히 말해 Java의 Classloader가 로드한 class들의 metadata가 저장되는 공간 -> (method area 의미)

    • 저장 데이터: 클래스 멤버 변수의 이름, 데이터 타입, 접근 제어자 정보와 같은 각종 필드 정보들과 메서드 정보, 데이터 Type 정보, static변수, final class 등
    • 생명주기: JVM 시작 ~ JVM 종료
    • 스레드에 의해 공유 => 멀티 스레드면 서로 공유가 가능하겠죠?
  2. Stack 영역

    모든 함수 호출은 스레드의 스택 메모리에 프레임 블록으로 추가

    • 저장 데이터: 메서드 호출과 함께 지역 변수, 매개변수, 메서드 호출 정보 등
    • 생명주기: 스레드 시작 ~ 스레드 종료
    • 스레드별로 별도 관리
  3. Heap 영역

    • 저장 데이터: new로 생성된 객체, 배열 등 인스턴스, Constant Pool(상수 풀)
      Young Generation (Eden, Survivor), Old Generation => GC관련
    • 생명주기: 프로그램 시작 ~ 프로그램 종료 + GC대상
    • 스레드에 의해 공유 => 멀티 스레드면 서로 공유가 가능하겠죠?
  4. PC Register

    • 저장 데이터: 스레드별 실행 명령어 주소 -> CPU의 레지스터와는 다르다
    • 생명주기: 스레드 시작 ~ 스레드 종료
    • 스레드별로 별도 관리
  5. Native Method Stack: 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역

    • 저장 데이터: 네이티브 메서드 정보
    • 생명주기: 네이티브 메서드 호출 시 ~ 네이티브 메서드 실행 완료 시
    • 스레드별로 별도 관리

표로 한눈에 보기

Runtime Data Area


JVM 메모리 구조 그림

메모리 구조


JVM 메모리 구조 코드를 그려보는 예시

메모리 구조 코드


Heap은 낮은주소에서 높은주소로 데이터 쌓고, Stack은 높은주소에서 낮은주소로 데이터 쌓는다.
따라서 서로에게 확장하는 방향으로 메모리 상에서 영역이 확장됨을 그림에서 알 수 있다.

메모리 확장


참고

  • https://velog.io/@sysy123/JAVA-JVM-%EA%B5%AC%EC%A1%B0
  • https://coding-factory.tistory.com/830

댓글남기기