1. JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.

유재희·2020년 12월 25일
0

JavaStudyLive

목록 보기
1/4
post-thumbnail

1. JVM은 무엇인가.

Java Virtual Machine의 줄임말로 Java byte code를 OS에 맞게 해석 해주는 역할을 한다.

Java Compiler는 .java 파일을 .class 라는 Java Byte Code로 변환시켜준다. Byte Code는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다. JVM은 OS가 Byte Code를 이해할 수 있도록 해석해준다. 이 과정 때문에 c언어 같은 네이티브 언어에 비해 속도가 느린 단점이 있었지만 JIT(Just In Time) 컴파일러를 구현해 이 단점을 극복했다.

Byte Code는 JVM위에서 OS에 상관없이 실행된다. OS에 종속적이지 않고 Java파일 하나만 만들면 JVM위에서 실행이 가능하다.
JVM은 크게 Class Loader, Runtime Data Areas, Excution Engine 3가지로 구성되어있다.

JVM의 구조

Class Loader
Runtime 시점에 클래스를 로딩하게 해주며 클래스의 인스턴스를 생성하면 클래스 로더를 통해 메모리에 로드하게 됩니다.

Runtime Data Areas
JVM이 프로그램을 수행하기 위해 OS로 부터 별도로 할당받은 메모리 공간으로 크게 5가지 영역으로 나눠진다.

Excution Engine
Load된 Byte Code를 실행하는 Runtime Module이 Excution Engine이다. Class Loader를 통해 JVM 내의 Runtime Data Areas에 배치된 바트코드는 Excution Engine에 의해 실행되며, 실행 엔진은 자바 바이트 코드 명령어 단위로 읽어서 실행한다.


2. JAVA 컴파일 방법

"Hello, World!" 문자열을 출력하는 파일 first_step.java를 생성후
Java Compiler의 javac 명령어로 컴파일을 하면 Byte Code로 변환된 first_step.class 파일이 생성된다. 그러나 Byte Code는 아직 기계가 해석할 수 없는 반기계어로 Class Loader에 의해 JVM에 로드되며 Excution Engine으로 번역되고 Runtime Data Areas에 배치된다.

Excute Engine에는 Interpreter와 JIT Compiler 가 있다.

Interpreter는 Byte Code를 한 줄씩 읽어 속도가 느린 단점이 있었고 이것을 보완한게 JIT(Just-In-Time) Compiler다.


3. JAVA 실행하는 방법

Java Compiler에 의해 컴파일된 first_step 파일을 java라는 명령어로 cmd에서 실행했다.

간단하게 정리하자면 사용자가 만든 소스코드 .java파일을 Java Compiler를 통해 컴파일 하고 .class 파일(Byte Code)이 생성되면 JVM에 의해 기계어로 번역되어 실행된다.


4. 바이트 코드란 무엇인가?

프로그래머가 작성한 자바 소스코드 .java 텍스트 파일을 Java Compiler를 통해 컴파일하면 .class 파일이 생성된다. 이 파일이 바로 바이트 코드다. 소스코드 보다는 기계어에 가깝고 기계어보다는 추상적이다. 쉽게 말하자면 중간언어라고 할 수 있다.

자바에서는 이 바이트 코드를 JVM이 완전한 기계어로 번역하여 실행한다.


5. JIT 컴파일러란 무엇이며 어떻게 동작하는가?


(이미지 참조 : https://bloofer.tistory.com/21)

JIT(Just-In-Time) 컴파일러는 런타임시 .class바이트 코드를 네이티브 코드로 컴파일하여 JAVA 응용 프로그램의 성능을 향상시키는 런타임 환경의 구성 요소이다.

JAVA 메소드가 호출 될 때 활성화된다. JIT 컴파일러는 해당 메서드의 바이트 코드를 네이티브 코드로 "적시에" 실행되도록 컴파일한다. 메소드가 컴파일되면 JVM은 해석하는 대신 해당 메소드의 컴파일된 코드를 직접호출한다. 이런 방식으로 컴파일한 메소드는 더이상 새로 컴파일 하지않아 속도를 높인다.


6. JVM 구성 요소.

JVM의 구성요소는 위에 언급한 바와 같이 크게 3가지로 나눌 수 있다.

-Class Loader
JAVA는 런타임에 클래스를 처음 참조할 때 해당 클래스를 로드하고 링크하는 방식을 취한다. 이 동적 로드를 담당하는 부분이 Class Loader이다.

-Run Time Areas
런타임 데이터 영역은 JVM이라는 프로그램이 운영체제 위에서 실행되면서 할당받는 메모리 영역이다. 위의 PC 레지스터, JVM 스택, 네이티브 메서드 스택은 스레드마다 하나씩 생성되며 힘과 메서드 영역(런타임 상수 풀)은 모든 스레드가 공유한다.

-Excution Engine
실행 엔진은 클래스 로더가 JVM 내의 런타임 데이터 영역에 배치한 바이트코드를 실행하는 역할을 한다. 자바 바이트코드는 완벽한 기계어가 아니라 실행 엔진에 의해 기계어로 변경되는데 그 방법은 두 가지가 있다.

인터프리터 : 바이트코드 명령어를 하나씩 읽어 해석하고 실행한다. 하나씩 해석하고 실행하기 때문에 바이트코드 하나하나의 해석은 빠르나 결과의 실행은 느리다는 단점이 있다. 바이트코드라는 언어는 기본적으로 인터프리터 방식으로 동작한다.
JIT(Just In Time) 컴파일러 : 인터프리터 방식의 단점을 보완하기 위해 도입된 것이다.


7. JDK와 JRE의 차이

JDK란?
Java Development Kit의 약자로 말그대로 자바 개발시 필요한 툴킷을 제공하는 도구모음이다. 개발하려면 당연히 실행도 시켜야 하므로 JDK 안에는 JRE가 포함되어 있다.

JRE란?
Java Runtime Environment의 약자로 자바 프로그램을 실행시켜주는 환경을 구성해주는 도구다. 즉 JAVA를 개발할 필요는 없는데, 실행은 시켜줘야 하는 경우에는 꼭 JRE가 있어야 한다.


위의 글과 공부는 구글링을 통해 다른 사람들의 블로그, 문서 등을 참조하였습니다.

참조 링크 :
https://medium.com/pocs/jvm%EC%9D%B4-%EC%9E%90%EB%B0%94%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95-3ac22cb22916

https://wiserloner.tistory.com/542

https://aljjabaegi.tistory.com/387

https://m.blog.naver.com/PostView.nhn?blogId=goddlaek&logNo=221104385038&proxyReferer=https:%2F%2Fwww.google.com%2F

https://blog.naver.com/hsm622/222138523668

https://medium.com/@jw02048/%EB%B0%94%EC%9D%B4%ED%8A%B8-%EC%BD%94%EB%93%9C%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-df320f96e254

https://medium.com/@ahn428/java-jit-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-c7d068e29f45

https://odol87.tistory.com/5

https://devpouch.tistory.com/9

profile
몰라요

0개의 댓글