Java Virtual Machine의 줄임말로, OS가 ByteCode를 이해할 수 있도록 하는 것이다.
기본의 Java Source File은 ---- (Java Compliler에 의해 컴파일 되어) ----> Java ByteCode(.class)로 변화한다.
이렇게 나온 최종 Java ByteCode를 OS의 종류에 관계없이, 실행할 수 있도록 하는 것이 JVM인 것이다.
따라서 이러한 JVM의 해석을 거쳐야 하기때문에, 과거에는 C언어에 비해 속도가 느리다 라는 평가가 있었지만,
지금은 아래에서 설명할 JIT(Just In Time)컴파일러를 통해 속도에 관한 단점을 극복하였다.
javac라는 명령어를 통해 컴파일 할 수 있다.
예를들어, javac hello.java(Java Source File)를 수행한다면, hello.class(Java ByteCode)라는 파일이 만들어지는 것이다.
주요 javac 옵션은 다음과 같다.
출처 : https://gblee1987.tistory.com/173
공부를 하다 새롭게 알게된 사실은,
1. 자바 하위 버전의 컴파일러를 사용했을때는, 상위 버전으로 실행했을 때 정상적으로 실행이 되지만,
2. 자바 상위 버전의 컴파일러를 사용했을때, 하위 버전으로는 실행할 수 없다는 것이다.
하지만 2번과 같은 경우에, 상위 버전의 컴파일러를 사용하면서 컴파일 옵션을 준다면 해결이 가능하다.
javac의 옵션에서 설명한 부분에서의 -source, -target의 자바 버전 지정을 통해 이와 같은 문제점을 해결할 수 있다.
java라는 명령어를 통해 실행할 수 있다.
이어서 예를들면,
javac라는 명령어를 통해 hello.java(Java Source File)을 hello.class(Java ByteCode)를 만들수 있고,
java라는 명령어를 통해 hello.class(Java ByteCode)를 실행할 수 있는 것이다.
JVM이 이해할 수 있는 언어로, 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트이기에
바이트코드라고 불린다.
Java Source File은 ---- (Java Compliler에 의해 컴파일 되어) ----> Java ByteCode(.class)로 변화한다.
기존의 방식은 Interpreter방식으로, 명령어를 하나씩 해석하는식으로 처리하였다.
이러한 방식은 실행속도면에서 효율적이지 않은 방식이다.
이를 해결하기 위해 나온 바식이 JIT컴파일러이다.
JIT컴파일러는, .class(Bytecode)중에 자주 쓰이는 요소를 캐싱하여, 이후 중복 부분이 나타나면, 바로 꺼내서 사용하는 방식으로 동작한다.
따라서 실행속도면에서 보다 효율적이다.
출처 : https://aboullaite.me/understanding-jit-compiler-just-in-time-compiler/
출처 : https://www.guru99.com/java-virtual-machine-jvm.html
JVM은 JRE에 속해있는, .class(Java ByteCode)실행 할 수 있도록 한다.
JVM의 구성요소에 대해서 간략히 말해보자면,
1 : Class Loader
JDK : JRE를 포함하는 개념으로, Java용 SDK(Software Development Kit)이다.
따라서, 컴파일러(javac)와, jdb 등등 프로그램을 생성하고 컴파일할 수 있도록 한다.
JRE : Java Runtime Environment로, JVM등 Java 프로그램을 실행하는데 필요한 것들을 포함하는 것이다.