본문 바로가기

JVM

@정소민fan2025. 9. 6. 21:33

jvm.. java virtual machine의 약자이다.

어느 환경이든 jvm만 있으면 자바 프로그램을 실행시킬수 있다.

jvm의 동작 방식과 구조를 한번 알아보자

동작 과정

우리가 작성한 자바 파일은 자바 컴파일러에 의해 자바 바이트 코드로 바뀌어 JVM에게 전송된다.

여타 다른 언어가 컴파일러를 통해 어셈블리어로 바뀌는 것과는 다른 과정이다.

이 자바 바이트 코드는 JVM 내에서 어떻게 사용되는지 따라가보자.

JVM 내부 구조

jvm 내부는 크게 클래스 로더, 실행 엔진, 런타임 데이터 영역 이렇게 총 3가지로 나눌 수 있다.

Class Loader

클래스 로더는 자바 바이트 코드를 읽어서 런타임 데이터 영역에 적재하는 역할을 한다. 이를 위해 다음 3단계를 따른다.

  • 로딩 (Loading) : 바이트 코드를 런타임 데이터 영역의 메소드 영역에 적재한다.
  • 링크 (Linking) : 바이트 코드를 검증하고 메모리를 할당하며, 심볼릭 참조를 실제 메모리 주소로 변환한다. 이는 C 링커의 과정과 유사한듯
  • 초기화 (Initialization) : static 변수의 값을 할당하고, static 블록을 실행한다.

Execution Engine

런타임 데이터 영역에 적재된 바이트코드를 실제로 실행하는 역할을 한다. 실행 중에 아직 적재되지 않은 바이트코드가 필요하면, 클래스 로더에게 요청하여 런타임 데이터 영역에 코드를 적재한 뒤 실행한다.

  • 인터프리터
    • 바이트코드를 하나씩 읽어서 해석하고 실행한다. 한줄씩 읽기 때문에 당연히 느리다
  • JIT 컴파일러
    • 위 인터프리터의 단점을 보완한다. 자주 반복되는 코드를 런타임에 컴파일하여 캐싱해두어, 다음에 인터프리터를 거치지 않고 직접 실행할수 있도록 하여 성능을 향상시킨다.
  • 가비지 컬렉터
    • 힙 영역에서 더이상 사용되지 않는 데이터를 찾아 메모리에서 자동으로 해제한다.

Runtime Data Area

JVM이 프로그램을 실행하면서 사용하는 메모리 공간이다. 자바 프로그램을 실행할 때 OS로부터 메모리를 할당받아 사용한다.

  • 메소드 영역
    • 클래스 이름, 메소드 정보 등의 클래스 수준의 정보와 static 변수가 저장된다.
    • 모든 스레드가 공유한다.
    • 이 영역에 클래스 로더가 바이트코드를 적재한다.
  • 힙 영역
    • 런타임에 동적으로 생성된 (new 키워드) 모든 객체와 배열이 저장되는 공간이다.
    • 실행 엔진이 동적으로 클래스 로더에게 클래스 로딩을 요청하여 힙 영역에 적재시켜준다.
    • 실행 엔진의 가비지 컬렉터가 이 영역에서 동작한다.
    • 모든 스레드가 공유한다.
  • 스택 영역
    • 각 스레드마다 하나씩 가지는 영역이다.
    • 각 메소드가 호출될때마다 스택 프레임이라는 영역이 쌓인다. 메소드 실행이 끝나면 해당 스택 프레임은 삭제된다. 그래서 재귀 함수를 잘못 사용하면 StackOverflow 에러가 발생하는 것.
  • PC 레지스터
    • 현재 스레드가 실행 중인 명령어의 주소를 저장한다.
  • 네이티브 메소드 스택
    • 자바 코드가 아닌 C/C++ 같은 코드로 작성된 메소드를 호출할 때 사용되는 메모리 공간이다. 예를 들면 스레드를 만들 때 사용되는 pthread_create 같은 함수가 쌓인다.

 

동작 흐름을 크게 보면

  1. 자바 컴파일러가 .java 파일을 .class 자바 바이트 코드로 변환
  2. 클래스 로더가 처음 실행에 필요한 바이트 코드를 로딩, 링크하여 런타임 데이터 영역에 적재
  3. 실행 엔진이 런타임 데이터 영역의 메소드 영역의 바이트코드를 읽으면서 코드 실행
    1. 만약 필요한 코드가 적재되지 않았다면, 클래스 로더에게 요청하여 메소드 영역에 적재되도록 함
    2. new 키워드를 만나면 힙 영역에 동적으로 객체 생성

이렇게 되겠다. 다음에는 가비지 컬렉터의 동작을 알아봐야겠다.

'Java' 카테고리의 다른 글

JVM 튜?닝?  (1) 2025.11.27
자바 가비지 컬렉터 (GC)  (0) 2025.09.07
SOLID 원칙  (0) 2025.09.05
와일드카드<?>가 무엇인가?  (0) 2025.08.23
Supplier는 왜 쓰는걸까?  (0) 2025.08.16
정소민fan
@정소민fan :: 코딩은 관성이야

코딩은 관성적으로 해야합니다 즐거운 코딩 되세요

목차