Programming/JAVA

JVM이란?

잇나우 2020. 12. 21. 16:40
반응형

JVM 이란?

Java Virtual Machine의 약자로 자바 가상 머신을 의미 한다. Java Byte Code를 OS에 맞게 해석을 해주기 때문에 JAVA의 애플리케이션이 OS에 영향을 받지 않고 실행할 수 있게해주는 역할을 한다.
Java Compiler가 .java파일을 .class파일인 Java Byte Code로 변환을 해준다. 하지만 Java Byte Code는 OS에서 바로 실행 할 수가 없다. 이 Byte Code를 OS에 맞게 실행할 수 있게 해석해주는 것이 JVM이다.

자바 바이트 코드 (Java Byte Code)

JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미한다. (.class파일)
자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트여서 자바 바이트 코드라고 부른다.

JVM 구성

이미지 출처: https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2

  • Class Loader
    Runtime 시에 동적으로 클래스(.class파일)를 로드한다. 클래스의 인스턴스를 생성하면 Class Loader를 통해 메모리에 로드하게 된다.

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

    • PC Register
      각 Thread 별로 하나 씩 존재하며 현재 수행중인 Java Virtual Machine Instruction의 주소를 가지게 된다. (Stack-Base로 동작)
    • Java Virtual Machine Stack
      Thread가 시작될 때 생성되며, Thread의 수행 정보를 Frame을 통해서 저장하게 된다. Method와 Method 정보는 Stack에 쌓인다.
    • Native Method Stack
      Java 외의 언어로 작성된 네이티브 코드들을 위한 Stack, JNI (Java Native Interface)를 통해 호출되는 코드를 수행하기 위한 Stack
    • Method Area
      모든 쓰레드가 공유하는 메모리 영역이다. 클래스, 인터페이스, 메소드, 필드, static 변수등의 바이트 코드를 저장
    • Heap
      런타임시 동적으로 할당하여 사용하는 영역 class를 이용해 instance를 생성하면 Heap에 저장
  • Execution Engine
    로드된 클래스의 Byte Code를 실행하는 Runtime Module. Class Loader를 통해 JVM내의 Runtime Data Areas에 배치된 바이트 코드는 Execution Engine에 의해 실행되며 Java Byte Code를 명령어 단위로 읽어서 실행한다.

Java Compiler

자바소스 코드를 자바 가상머신이 이해할 수 있는 자바 바이트 코드로 변환한다. 자바를 설치하면 javac.exe라는 실행 파일 형태로 설치 된다.

Class Loader의 Execution Engine에는 Interpreter와 JIT Compier가 있다. 처음 JVM이 나왔을 때는 Interpreter 방식 (한 줄씩 해석하여 실행하는 방식)이여서 속도가 느리다는 단점이 있었으나 JIT 방식을 통해 이를 보안했다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없다.

  • JIT Compiler
    Byte Code를 코드가 실행되는 과정에 실시간으로 기계어로 변환 한다. (Just-In-Time)
    JIT 컴파일에는 프로세서 시간 및 메모리 사용이 필요하다. JVM은 각 메소드에 대해 사전 정의된 컴파일 임계값에서 시작되고 해당 메소드가 호출될 때마다 감소되는 호출 갯수를 유지보수한다. 호출 갯수가 0에 도달하면 해당 메소드에 대한 JIT 컴파일이 트리거된다. 자주 사용되는 메소드는 JVM이 시작된 직후 컴파일 되며, 자주 사용되지 않는 메소드는 훨씬 나중에 컴파일 되거나 컴파일되지 않을수도 있다.
    JIT 컴파일러는 다양한 최적화 레벨 (cold, warm, hot, veryHot)에서 메소드를 컴파일할 수 있다. 최적화 레벨이 높을수록 더 나은 성능을 제공할 것으로 예상되지만 CPU와 메모리 측면에서 비용이 높아진다. 기본 최적화 레벨은 warm이지만 경우에 따라 cold로 다운그레이드 될 수도 있다.

  • 컴파일 하는 방법
    자바 소스코드를 작성한뒤 콘솔에서 .java파일이 있는 디렉토리로 이동하거나 파일에 디렉토리를 지정해 javac명령어를 사용한다.

  • 역컴파일 하는 방법
    javap 명령어를 이용한다. -c 옵션을 이용해서 바이트 코드의 내용을 확인할 수도 있다.

  • java파일 실행하는 방법
    java명령어를 이용한다.

JDK와 JRE

  • JRE
    Java Runtime Environment의 약자로 자바 실행환경을 말한다. JVM, 자바 클래스 라이브러리등 자바 프로그램을 실행하는데 필요한 모든 패키지가 들어있다.
  • JDK
    Java Develpoment Kit의 약자로 자바 개발도구를 의미. JRE의 모든것과 자바의 모든 기능을 갖춘 SDK이기 때문에 프로그램을 작성하거나 컴파일 할 수 있다.

    이미지 출처: https://wakestand.tistory.com/378

참고
https://medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
http://www.tcpschool.com/java/java_intro_programming
https://www.ibm.com/support/knowledgecenter/ko/SSYKE2_8.0.0/com.ibm.java.vm.80.doc/docs/jit_optimize.html

반응형