[JAVA] JVM이란? 개념 및 구조

    JVM (Java Virtual Machine, 자바 가상 기계)

    JVM이 필요한 이유

     

    자바 프로그램을 개발 하기 위해서는우선 자바 언어로 자바 소스 파일(.java)을 생성하고 컴파일을 하면 확장명이 .class인 바이트 코드 파일이 생성된다. 이 바이트 코드는 완전한 기계어가 아니므로 운영체제에서 바로 실행할 수 없어 JVM이라는 번역기로 기계어 번역 후 실행을 할 수 있습니다.

     

    JVM은 바이트 코드 파일을 해당 운영체제에서 실행 가능한 기계어로 번역해 실행하므로 다양한 운영체제에서 수정하지 않고 사용할 수 있습니다. 예를 들면 윈도우 운영체제에서 개발한 바이트 코드 파일을 리눅스로 옮겨도 바로 실행 할 수 있습니다.

     

     

    JVM의 구조 - Garbage Collector, Execution Engine, Class Loader, Runtime Data Area 

     

    Class Loader

    JVM 내로 클래스 파일을 로드하고, 클래스의 인스턴스를 생성하면 메모리에 로드하는 동적으로 클래스를 로드하는 역할을 한다.

     

    Execution Engine

    클래스 로더를 통해 JVM 내의 Runtime Data Area에 배치된 바이트 코드들을 실행한다.

     

    Garbage Collector

    힙 메모리 영역에 생성된 객체들 중에서 참조되지 않은 객체들을 탐색 후 제거한다.

     

    Runtime Data Area

    JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역이다. 크게 아래 다섯 개 영역으로 나눌 수 있다.

     

    (1) Method 영역

    • 어떤 클래스가 사용되면 JVM은 해당 클래스파일을 읽어 클래스 데이터를 이곳에 저장한다.
    • 클래스 변수도 이 영역에 함께 생성된다.
    • 메소드, 클래스, 인터페이스, 필드 등의 바이트 코드가 저장된다.

    (2) Heap 영역

    • 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다.
    • 메소드 영역에 로드된 클래스만 생성이 가능하다.

    (3) Stack 영역

    • 메소드 호출 시마다 각각의 스택 프레임(그 메서드만을 위한 공간, 중괄호 {} 로 묶인 공간)을 생성한다. 
      그리고 메소드 안에서 사용되는 값들을 저장하고, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산의 중간결과 값들을 임시로 저장한다. 
    • 메소드 수행이 끝나면 프레임별로 삭제하여 할당되었던 메모리공간은 비워진다. 그리고 메소드 안에서 호출된 값들은 다시 쓸 수 없게된다.

    (4) PC Register

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

    (5) Native method stack

    자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역이다.

     

     

    728x90

    댓글