Java

[Java] JVM (Java Virtual Machine) 노트정리

leejunkim 2025. 5. 30. 17:53

먼저 이 포스트에 간단하게 JVM을 소개 해보았다. 이 글은 JVM에 대해서 조금 더 자세히 다룰 예정이다.

 

핵심 역할

JVM은 .class 파일에 담긴 bytecode를 읽어들여서 현재 실행되고 있는 운영체제가 이해할 수 있는 기계어 (native machine code)로 번역하고 실행한다. 

 

JVM은 크게 Class Loader, Execution Engine, Garbage Collector, Runtime Data Area로 구성되어있다.

Class loader

  • 개발자가 쓴 .java파일은 컴파일러를 거치면 bytecode(.class)로 변환된다. Class Loader는 이 .class 파일들을 Runtime Data Areas에 적재한다

Execution Engine

  • 클래스를 실행시키는 역할이다. Class Loader에 의해 Runtime Data Areas에 적재된 .class 파일들을 기계어로 변경한다
  • 여기서 명령어 실행하는 방법은 Interpretor, JIT(Just-In-Time)이 두가지 방법이 있다.
    • Interpretor: 명령어를 하나하나 실행한다 (한줄씩 수행하기 때문에 느리다는 단점이 있다)
    • JIT: 인터프리터 방식으로 실행하다가 적절한 시점에 bytecode를 컴파일해서 기계어로 변경한다

Runtime Data Area

자바 프로그램을 실행할 때 사용되는 데이터들을 저장하는 OS에서 할당받은 메모리 공간이다.

영역은 Method(static) Area, Heap Area, Stack Area, PC Register, Native Method Stack이 있다.

하지만 메모리를 크게 보려면 Method, Heap, Stack으로 나뉜다.

  • MethodArea(메소드 영역)
    • JVM이 시작될 때 생성됨
    • 클래스 단위의 정보를 저장함
      • 클래스 정보 (이름, super 클래스 이름, 인터페이스 등), 필드 정보, 메소드 정보
      • static variables, constants (final static), constant pool
    • 클래스가 처음 로드될 때 생성되며, JVM 종료 시까지 유지
    • 모든 thread에서 공유됨
  • Head Area(힙 영역)
    • new 키워드로 생성되는 객체와 배열이 생성되는 영역 (where ALL objects live)
      • new 키워드로 생성된 객체 인스턴스 (Person p = new Person(); 여기서 new Person() 부분이 힙에 생성)
      • new 키워드로 생성된 배열 (int[] arr = new int[5]; 여기서 new int[5] 부분이 힙에 생성)
    • 메소드 영역에 적재된 클래스만 생성 가능함 ( = 클래스가 먼저 메모리에 로드되어야 함)
    • GC(Garbage Collection)의 대상
    • JVM에는 오직 하나의 힙만 존재
  • Stack Area(스택 영역)
    • 메소드 호출 시마다 생성되는 각 메소드의 작업 공간
      • 메소드가 호출될 때마다 해당 메소드를 위한 스택 프레임(Stack Frame)이 스택 영역에 쌓이고, 메소드 실행이 끝나면 해당 프레임이 스택에서 제거됨
      • 메서드 종료 시 자동 제거 (LIFO 구조)
    • 각 프레임에 저장되는 정보
      • 지역 변수, 매개변수, 리턴 값, 메소드 호출 정보 (method invocations, local variables, etc)
    • 참조형 변수의 경우
      • Person p = new Person();과 같은 참조 타입(reference type) 변수는 스택 영역에 참조 변수(p)만 생성되고, 이 참조 변수는 힙 영역에 생성된 실제 객체 인스턴스의 메모리 주소를 저장하여 힙 영역의 객체를 '참조'하게 됨

  • PC Register
    • Thread가 생성될때마다 생성되는 공간 (thread마다 하나씩 존재한다)
    • 영역으로 현재 실행되는 쓰레드의 주소와 명령을 저장
  • Native Method Stack Area
    • 자바 외 언어로 작성된 네이티브 코드를 위한 영역

Garbage Collector

힙 영역에 생성된 객체들 중에서 더이상 사용되지 않는 객체들을 탐색 후 제거하는 역할을 한다.

자세한 포스팅은 여기에 있다.

 

출처

- https://cjw-awdsd.tistory.com/26

- https://blog.devgenius.io/what-is-garbage-collector-stack-heap-in-java-80c33c2a0234