JVM이란 Java Virtual Machine의 줄임말로 Java Byte Code를 OS에 맞게 해석해주는 역할을 한다.
Java Byte Code
자바 가상 머신(JVM)이 이해할 수 있는 언어로 변환된 자바 소스 코드
- 운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에 운영체제와 자바 프로그램을 중계하는 JVM을 두어 자바 프로그램이 여러 운영체제에서 동일한 실행 결과가 나오게 한다.
- Java Byte Code의 확장자는 .class
따라서 OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행할 수 있다는 것이 Java의 큰 장점이다.
JVM은 크게 4가지 구성으로 나누어진다.
1. Class Loader
2. Execution Engine
3. Garbage Collector
4. Runtime Data Area
: Java 컴파일러에 의해 Byte Code로 변환된 클래스를 읽어들여 Runtime Data Area에 적재한다.
: Class Loader에 의해 Runtime Data Area에 적재된 클래스(Byte Code)를 기계어로 변환하고 실행한다.
: Garbage Collector(GC)는 Heap 영역에 생성되어 있는 객체들 중 참조되지 않은 객체를 찾아 제거한다.
: JVM의 메모리 영역으로, Java 애플리케이션을 실행할 때 사용되는 데이터들을 적재한다.
terminal창에서 자바 코드를 실행해보기 위해 "hello, world!"를 출력하는 간단한 예제를 작성하였다.
먼저, javaTest파일이 존재하는 디렉토리로 이동해야하기 때문에 경로를 복사해준다.
복사한 파일 경로 : /Users/eojeong-yun/IdeaProjects/javastudy/src/main/java/javaTest.java
복사한 파일의 경로로 이동할때는 마지막에 있는 javaTest.java는 디렉토리가 아니기 때문에 지워야한다.
해당 디렉토리로 옮겨서 하위 목록을 보면 javaTest.java라는 파일이 하나 존재한다.
아래 코드를 입력해주고 다시 목록을 봤을 때 javaTest.class라는 파일이 생성됐으면 컴파일에 성공한 것이다.
$ javac 파일명.java
디렉토리 하위 목록을 보면 .java 파일과 .class 파일이 있는 걸 알 수 있다.
아래 코드를 입력하면 코드가 실행된다.
$ java 파일명
컴파일을 하지 않았을 때도 자바 코드를 실행해볼 수 있다.
컴파일을 하지 않았을 때는 아래와 같이 Java Byte Code가 없다는 걸 확인할 수 있다.
이럴 때는 아래와 같이 코드 파일에 확장자명까지 추가해주면 된다.
$ java 파일명.java
JIT란 Just In Time의 약자로, JIT 컴파일러는 프로그램을 실행하는 시점에(실시간으로) 기계어로 번역하는 컴파일러이다.
JIT 컴파일러는 같은 코드를 매번 해석하지 않고 실행할 때 컴파일하면서 해당 코드를 캐싱해버린 후, 바뀐 부분만 컴파일하고 나머지는 캐싱된 코드를 사용한다.
따라서, 인터프리터의 속도를 개선할 수 있다.
JIT 컴파일러는 런타임 시 Java 애플리케이션의 성능을 향상시키는 JRE(Java Runtime Environment)의 구성요소이다. Java 프로그램은 Byte Code를 포함하는 클래스로 구성되는데, 런타임에 JVM은 클래스 파일을 로드하고 각 개별 Byte Code의 의미를 결정하고 적절한 계산을 수행한다. 해석 중 추가 프로세서 및 메모리 사용량은 Java 애플리케이션보다 느리게 수행됨을 의미한다. JIT 컴파일러는 런타임에 Byte Code를 Native Code로 컴파일하여 Java 프로그램의 성능을 향상시킨다.
자바 프로그램을 개발하려면 JDK를 사용하면 되고, 개발된 프로그램을 실행만 한다면 JRE만 설치하면 된다.
좋은 글 감사합니다