자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
자바의 유명한 슬로건 중 하나 인 Write once, Run Everywhere(한번만 작성하고 어디서나 실행하세요.)처럼
자바는 어느 운영체제 상에서도 실행될수 있게 하고 jvm이라는 가상머신을 이용해서 간접적으로 접근하여 오브젝트가 필요해지지 않는 시점에 알아서 메모리 관리를 하게된다.
classfile
을 입력하면 아래 처럼 실행이 가능하다.BYTECODE
는 자바가상머신이 이해할수 있는 언어로 변환된 자바 소스코드를 의미한다.
컴파일 타임 환경에서 java소스코드를 자바컴파일러가 BYTECODE
를 생성하게 된다.
class파일만 있으면 어떤 환경에서든 실행가능하다.
java컴파일->Byte코드생성(.class파일)->JVM에 의해서 기계어로 번역
Java 코드는 자바컴파일러를 통해 ByteCode로 변환이 된다. 그리고 ByteCode는 다시 기계어로 번역이 된다. 자바 컴파일러가 Byte코드 변환 -> jvm에 의해서 기계어로 번역 하는 과정이 많고 이과정에 의해 작업 비용이 많이 든다. 이러한 단점을 극복 하기 위해 JIT방식이 나오게 되었다.
JIT컴파일러는 같은 코드를 매번 해석하는 대신 처음 실행될때 인터프리트를 하면서 자주 쓰이는 코드를 캐싱한뒤 이후에 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린실행 속도를 개선할 수있다.
jvm은Class Loader
, Garbage Collector
,Execution Engine
,Runtime Data Area
4가지 구성요소를 가지고있다.
Class Loader
Class Loader
은 자바클래스를 JVM으로 동적로드 하는 JRE의 일부 이다.
Class Loader
는 라이브러리를 위치시키고 내용물을 읽으며 라이브러리들 안에 포함된 클래스들을 읽는 역할을 한다. 로딩은 일반적으로 요청이 오면 이루어지며 클래스가 프로그램에 의해 호출될때 까지 로드하지 않는다.
명명된 클래스는 주어진 클래스로더에 의해 한 번만 로드될 수 있다.
Execution Engine
Execution Engine
은 Class Loader
에 의해 JVM으로 로드된 Class파일(ByteCode)들은 Runtime Data Area
의 Method Area에 배치되는데 JVM은 Method Area의 바이트 코드를 Excution Engine
에 제공하여 Class에 정의된 내용대로 ByteCode를 실행 시킨다 이 때 Load된 파이트 코드를 실행하는 Runtime Module이 Execution Engine(실행엔진) 이다.
Runtime Data Areas
Runtime Data Areas
는 Process로서의 JVM이 프로그램을 수행하기 위해 OS로부터 할당 받는 메모리 영역이다.
-Runtime Data Areas
의 메모리 영역
Garbage Collector
자바는 메모리관리를 사용자가 아닌 JVM이 알아서 해준다.
jvm의 GC에서 메모리 정리는 따로 쓰레드로 동작하고있다.
JRE
는 Java Runtime Environment
의 약자 이다.
JRE
는 JVM
이 자바 프로그램을 동작시킬 때 필요한 라이브러리 파일들과 기타 파일들을 가징고 있다.JDK
는 Java Development Kit
의 약자 이다.
JDK
는 JRE
+ 개발에 필요한 Javac,java등을 포함한다.https://www.itworld.co.kr/news/110837
https://yaboong.github.io/java/2018/06/09/java-garbage-collection/
https://medium.com/@lazysoul/jit-just-in-time-16bb63f3ae26
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A1%9C%EB%8D%94
https://www.slipp.net/wiki/pages/viewpage.action?pageId=8880270