JVM 동작 방식

JVM

JVM 은 Java Virtual Machine 의 약자이다.

자바는 어떤 OS 든 실행되어지는데 JVM 이 그 역할을 하고 있다.

간단한 동작원리를 말해보자면

자바 언어로 작성된 자바파일을 자바 컴파일러가 바이트 코드로 변환 시켜 준다.

이렇게 변환된 코드를 JVM 이 해석하고 실행하는 방식으로 동작한다.

전체적인 흐름도는 아래 와 같다.

자바 소스 파일이 자바 컴파일을 통해 바이트코드로 변환되어서 클래스 로더로 향한다.

Class Loader

Load, Linking, initialize 와 같이 3단계로 나뉘어져있다.

Load : 클래스 파일을 JVM 메모리에 로드한다.

Linking : 해당 클래스 파일이 JVM 명세와 일치하는지 체크하고 필요로 하는 메모리에 할당한다.

Initialize : 클래스 변수들을 적절한 값으로 초기화 한다.

바이트코드를 동적 로드 하여 Runtime Data Areas 로 할당시켜준다.

동적로드 라는 의미는 불러올때 전부를 불러와서 할당 시키는게 아닌 필요할때마다 그때 그때 동적으로 로드 한 뒤 할당 시켜준다.

Excution Engine

인터프리터, JIT 컴파일러 를 혼합해서 바이트코드를 해석하고 읽어낸다.

JIT 컴파일러는 클래스파일을 네이티브 코드로 변환하여 캐싱 하는 방식으로 동작한다.

하지만 바이트코드를 네이티브 코드로 변환하는 비용이 들기 때문에

인터프리터 방식을 사용하다 일정 기준 (컴파일 임계치) 을 넘어서면 JIT 컴파일러를 사용한다.

또한 GC 도 여기서 동작한다.

METHOD AREA

  • 주로 클래스변수, 메서드, 생성자 등이 저장되는 공간

  • 어디서든 접근 가능

STACK

  • Premitive 형 지역변수, 객체 참조 변수가 저장되는 공간

  • 쓰레드 당 1개 씩 생성

  • 해당 쓰레드만 접근 가능

HEAP

  • 참조형 객체, 변수 등이 저장되는 공간

  • 어디서든 접근 가능

PC Register

  • 쓰레드 당 1개 씩 생성

  • 해당 쓰레드 명령어 주소를 저장하는 공간

Native Method Stack (Java Native Interface)

  • JIT 컴파일러에서 바이트코드를 네이티브로 변환해서 사용할때 해당 네이티브 코드가 실행되는 곳

  • Native Method Interface 와 연동해서 동작 , NMI 가 호출되면 JNI 가 하나 생성되는 방식

Native Method Library

  • JNI 가 이 라이브러리를 사용해서 실행된다.

Last updated