JVM이란? and 자바코드의 실행

Purple·2021년 7월 29일
0

JAVA

목록 보기
1/8
post-thumbnail

1. JVM이란?

Java Virtual Machine의 줄임말로, OS가 ByteCode를 이해할 수 있도록 하는 것이다.
기본의 Java Source File은 ---- (Java Compliler에 의해 컴파일 되어) ----> Java ByteCode(.class)로 변화한다.

이렇게 나온 최종 Java ByteCode를 OS의 종류에 관계없이, 실행할 수 있도록 하는 것이 JVM인 것이다.

따라서 이러한 JVM의 해석을 거쳐야 하기때문에, 과거에는 C언어에 비해 속도가 느리다 라는 평가가 있었지만,
지금은 아래에서 설명할 JIT(Just In Time)컴파일러를 통해 속도에 관한 단점을 극복하였다.

2. 컴파일 방법

javac라는 명령어를 통해 컴파일 할 수 있다.
예를들어, javac hello.java(Java Source File)를 수행한다면, hello.class(Java ByteCode)라는 파일이 만들어지는 것이다.

주요 javac 옵션은 다음과 같다.

출처 : https://gblee1987.tistory.com/173

공부를 하다 새롭게 알게된 사실은,
1. 자바 하위 버전의 컴파일러를 사용했을때는, 상위 버전으로 실행했을 때 정상적으로 실행이 되지만,
2. 자바 상위 버전의 컴파일러를 사용했을때, 하위 버전으로는 실행할 수 없다는 것이다.

하지만 2번과 같은 경우에, 상위 버전의 컴파일러를 사용하면서 컴파일 옵션을 준다면 해결이 가능하다.
javac의 옵션에서 설명한 부분에서의 -source, -target의 자바 버전 지정을 통해 이와 같은 문제점을 해결할 수 있다.

3. 실행방법

java라는 명령어를 통해 실행할 수 있다.
이어서 예를들면,
javac라는 명령어를 통해 hello.java(Java Source File)을 hello.class(Java ByteCode)를 만들수 있고,
java라는 명령어를 통해 hello.class(Java ByteCode)를 실행할 수 있는 것이다.

4. 바이트코드란?

JVM이 이해할 수 있는 언어로, 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트이기에
바이트코드라고 불린다.

Java Source File은 ---- (Java Compliler에 의해 컴파일 되어) ----> Java ByteCode(.class)로 변화한다.

5. JIT 컴파일러란? 동작 방법

기존의 방식은 Interpreter방식으로, 명령어를 하나씩 해석하는식으로 처리하였다.
이러한 방식은 실행속도면에서 효율적이지 않은 방식이다.

이를 해결하기 위해 나온 바식이 JIT컴파일러이다.
JIT컴파일러는, .class(Bytecode)중에 자주 쓰이는 요소를 캐싱하여, 이후 중복 부분이 나타나면, 바로 꺼내서 사용하는 방식으로 동작한다.
따라서 실행속도면에서 보다 효율적이다.


출처 : https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/

6. JVM 구성 요소


출처 : https://www.guru99.com/java-virtual-machine-jvm.html

JVM은 JRE에 속해있는, .class(Java ByteCode)실행 할 수 있도록 한다.

JVM의 구성요소에 대해서 간략히 말해보자면,
1 : Class Loader

  • Class Loader가 .class파일들을 JVM에 불러온다.
    2 : Method Area
  • 클래스 구조를 저장한다.
    3 : Heap
  • 개체, 인스턴스 변수 및 배열을 저장한다.
  • 그리고 이들은 여러 스레드에서 공유된다.
    4 : JVM Language Stacks
  • 각 스레드는 자체 JVM Stack이 있다.
  • 각 Stack은 로컬 변수를 저장한다.
  • 스택은 공유 자원이 아니다.
    5 : PC Registers
  • Java 가상 시스템 명령의 주소를 저장한다.
    6 : Native Method Staks
  • 네이티브 라이브러리에 따라, 네이티브 코드 명령을 보관한다.
    7 : Execution Engine
  • .class(Java ByteCode)는 이 실행 엔진의 의해 실행된다.
    8 : Native Method Interface
  • JVM에서 실행되는 것들이, 라이브러리 및 네이티브 애플로 호출될수 있도록 한다.
    9 : Native Method Libraries
  • 실행 엔진에 필요한 Libraries(C, C++)의 모음이다.

7. JDK와 JRE의 차이

JDK : JRE를 포함하는 개념으로, Java용 SDK(Software Development Kit)이다.
따라서, 컴파일러(javac)와, jdb 등등 프로그램을 생성하고 컴파일할 수 있도록 한다.
JRE : Java Runtime Environment로, JVM등 Java 프로그램을 실행하는데 필요한 것들을 포함하는 것이다.

profile
안녕하세요.

0개의 댓글