[JAVA] JVM이란?

[JAVA] JVM이란?

JVM(Java Virtual Machine)

JVM사용 이유 : 한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서

  • Java Byte Code를 OS에 맞게 해석 해주는 역할
    • Java compiler가 .java파일을 .class라는 Java byte code로 변환시켜 줌
    • Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행되지 않음
  • JVM은 OS가 ByteCode를 이해할 수 있도록 해석 해줌
    • Java와 OS 사이의 중계자 역할
  • 메모리관리, Garbage Collection 역할
  • JVM의 해석을 거치기 때문에 C언어 같은 네이티브 언어에 비해 속도가 느리지만  JIT(Just In Time)컴파일러를 구현해 극복함
  • Byte Code는 JVM위에서 OS에 상관없이 실행됨
    • OS에 종속적이지 않고 Java파일 하나만 만들면 어느 디바이스든 JVM위에서 실행 가능
  • JVM은 크게 3가지로 구성됨
    • ClassLoader
    • Runtime Data Areas
    • Excution Engine

Class Loader

  • RunTime시점에 클래스를 로딩하게 해주며, 링크릉 통해 배치하는 작업을 함
  • 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 됨

Runtime Data Areas

  • JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당 받은 메모리 공간
  • 크게 5가지로 나눌 수 있음
    • PC Register
      • Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로 thread마다 하나씩 존재
      • Thread가 어떤 부분을 어떤 명령으로 실행해야 할지에 대한 기록을 함
      • 현재 수행중인 JVM 명령의 주소를 가짐
    • Java Virtual Machine Stack
      •  프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
      • 각종 형태의 변수나 임시 데이터, 쓰레드나 메소드의 정보를 저장
    • Native Method Stack
      • 자바가 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
      • JAVA가 아닌 다른 언어로 작성된 코드를 위한 영역
    • Method Area
      • 클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간
      • 올라가게 되는 메소드의 바이트 코드는 프로그램의 흐름을 구성하는 바이트 코드
    • Heap
      • 객체를 저장하는 가상 메모리 공간
      • new연산자로 생성된 객체와 배열을 저장

Execution Engine

  • Load된 Class의 ByteCode를 실행하는 Runtime Moduel이 바로 Execution Engine
  • Class Loader를 통해 JVM내의 Runtime Data Areas에 배치된 byte code는 Execution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행



---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • 최초 JVM이 나왔을 당시에는 Interpreter방식(한 줄씩 해석하고 실행)이였기 때문에 속도가 느리다는 단점이 있었지만 JIT compiler 방식을 통해 이점을 보완함
    • JIT는 ByteCode를 어셈블러 같은 NativeCode로 바꿔서 실행은 빠르지만, 변환하는데 비용이 발생.
    • 물론 JIT 컴파일러가 컴파일하는 과정은 바이트코드를 인터프리팅하는 것보다 훨씬 오래 걸리므로, 한번만 실행하는 코드는 인터프리팅 방식이 유리
  • 이 같은 이유로 JVM은 모든 코드를 JIT Compiler방식으로 실행하지 않고 Interpreter방식을 사용하다 일정한 기준이 넘어가면 JIT Compiler방식으로 실행함



출처

댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?