JVM (Java Virtual Machine)

업데이트:

JVM

JVM (Java Virtual Machine) 역할

  • 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다.
  • JavaOS사이에서 중개자 역할을 수행한다. Java Byte Code (.class file)OS에 맞게 해석하여 JVM위에서 OS와 상관없이 실행된다.
    • 어느 환경에서나 JVM이 설치되어 있다면, Java 코드를 실행할 수 있다.
  • JVM은 스택기반의 가상머신이며, 메모리 관리Garbage Collection을 수행한다.

JVM1

JVM2

Java 프로그램 실행과정

  1. 프로그램이 실행되면 OSJVM에게 필요한 메모리를 할당한다.
  2. 자바 컴파일러(javac)자바 소스코드(.java)를 읽어 자바 바이트코드(.class)로 변환한다.
  3. Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
  4. 로딩된 class 파일들은 Excution engine을 통해 해석된다.
  5. 해석된 바이트 코드는 Runtime Data Areas에 배치되어 실질적인 수행이 이루어지게 된다.

JVM 구조

Class Loader

  • Runtime 시점에 클래스(.class)를 로드하고, 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 된다.
  • jar 파일 내 저장된 클래스들을 JVM 위에 올리고 사용하지 않는 클래스들을 메모리에서 삭제한다.

Excution Engine

  • 클래스를 실행시키는 역할이다. 클래스 로더가 JVM 내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 Excution Engine에 의해 실행된다.
  • 자바 바이트 코드는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다.
  • Excution Engine은 이러한 바이트 코드를 JVM 내부에서 Interpreter 혹은 JIT(Just In Time) 방식을 통해 기계가 실행할 수 있는 형태로 변환한다.

Runtime Data Area

  • JVM이 프로그램을 수행하기 위해 OS로부터 할당 받은 메모리 공간을 말한다.

Runtime Data Area 상세

스크린샷 2020-08-19 오후 5 28 47

  1. PC Register

    Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 스레드마다 하나씩 존재한다. 스레드가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행중인 JVM 명령의 주소를 갖는다.

  2. JVM Stack

    프로그램 실행과정에서 임시로 할당되었다가 메서드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 각종 형태의 변수나 임시 데이터, 스레드나 메서드의 정보를 저장한다. 메서드 호출 시 마다 각각의 스택 프레임이 생성되고 메서드 수행이 끝나면 해당 스택 프레임은 삭제된다.

    메서드 내부에서 사용되는 로컬 변수들과 매개 변수 및 해당 메서드 주소가 저장되며, primitive type 값도 저장된다.

  3. Native Method Stack

    자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역이다. 자바 이외의 언어(C, C++, 어셈블리)로 작성된 코드를 실행할때 해당 스택이 할당된다.

  4. Method Area (= Class or Static area)

    클래스 파일의 바이트 코드가 로드되는 영역이다. 프로그램을 실행 할 때 사용되는 클래스 파일들을 메모리에 올려놓는다. 어떤 메서드가 호출되면 스태틱 영역에 로드된 클래스에서 해당 메서드를 찾아 호출한다. 메인 메서드에서 사용하는 전역변수나 스태틱 변수 등이 이 영역에 올라온다.

  5. Heap

    객체를 저장하는 가상 메모리 공간이다. new 연산자로 생성된 객체와 배열을 저장한다.(모든 Object type) 클래스 영역에 올라온 클래스들만 객체로 생성할 수 있다. 힙 영역에 저장된 데이터는 메소드 호출이 끝나도 유지되며, 스택에서 가리키는 포인터값이 없으면 GC에 의해 메모리 해제된다.

References

댓글남기기