-
자바 JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가자바 스터디 2020. 12. 30. 22:36
백기선님의 Java 스터디를 진행하며 찾아본 내용입니다.
목표
자바 소스 파일 JVM으로 실행하는 과정 이해하기
학습할 것
- JVM이란 무엇인가
- JVM 구성 요소
- 바이트코드란 무엇인가
- 컴파일 하는 방법
- 실행하는 방법
- JIT 컴파일러란 무엇이며 어떻게 동작하는지
- JDK와 JRE의 차이
- JVM 이란 무엇인가
자바 코드 또는 어플리케이션의 런타임 환경을 제공해주는 엔진.
Java 바이트 코드로 컴파일 된 다른 언어로 작성된 프로그램 뿐만 아니라, Java프로그램을 실행할 수 있도록 해주는
가상머신이다.
2. JVM 구성 요소
JVM은 크게 클래스로더, 메모리 구역, 실행 엔진등을 포함한다
1) 클래스 로더
클래스 로더는 JVM의 서브시스템으로써 클래스파일을 로드하며 자바 프로그램을 구동할 때 첫 번째로 구동된다.
로딩, 링크, 초기화순으로 진행된다.
로딩
클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 "메소드"영역에 저장
이때 메소드 영역에 저장하는 데이터는 다음과 같다
- FQCN(Fully Qualified Connect name : 풀 패키지 경로)
- 클래스, 인터페이스, 이늄
- 메소드와 변수
- 로딩이 끝나면 해당 클래스 타입의 Class 객체를 생성하여 '힙' 영역에 저장한다.
링크
Verift, Prepare, Resolve(Optional) 세 단계로 나뉘어져 있다
Verify: .class 파일 형식이 유효한지 체크한다.
Preparation: 클래스 변수(static 변수)와 기본 값에 필요한 메모리
Resolve: 심볼릭 메모리 레퍼런스를 메소드 영역에 있는 실제 레퍼런스로 교체한다.
초기화
Static 변수의 값을 할당한다. (Static 블럭이 있다면 이 때 실행된다.)
클래스 로더는 계층 구조로 이루어져있으며 기본적으로 세 가지 클래스 로더가 제공된다.
- Bootstrap classLoader
java.lang 패키지와 같은 Java standard Edition의 모든 클래스, java.net 패키지 클래스들, java.util 패키지 클래스들, java.io 패키지 클래스들, java.sql 패키지 클래스 등등의 클래스 파일이 포함된 'rt.jar' 파일을 로드한다.
- Extension/Platform classLoader
BootstrapLoader의 자식클래스 중 하나로 $JAVA_HOME/jre/lib/ext 폴더에 있는 jar 파일을 로드한다.- System/Application ClassLoader
Extension classloader의 child 로더로 classpath로 부터 클래스 파일들을 로드한다. 기본적으로 classpath은 현재의 디렉토리이다. Application classLoader라고도 알려져있다.클래스를 읽어올 때 Bootstrap 클래스 로더가 못읽으면 Platform 클래스 로더가 읽어보고 그래도 못읽으면 Application 클래스 로더가 읽어 본 뒤, 그래도 못읽으면 ClassNotFoundException을 발생시킨다.
2) Method Area
Method Area는 클래스 수준의 정보(클래스 이름, 부모 클래스 이름, 메소드 ,변수)등을 저장한다. 공유 자원이다.
3) Heap
객체들이 저장되어지는 런타임 데이터 구역이다. 공유 자원이다.
4) JVM language stack
지역 변수가 일시적으로 저장되어지는 곳이다.또한 스레드들은 각자 자신의 JVM stack을 가지고 있는데, 스레드가 생성되어질 때 동시에 JVM 스택또한 생성되어진다.
메소드가 호출 될 때마다 새 프레임이 생성되고 메소드 호출 프로세스가 완료되면 삭제된다.
5) PC Register
PC 레지스터는 자바 가상 머신의 명령어들의 주소를 저장하는 곳이다.자바에서는 각각의 스레드들에 별도의 PC Register가 있다.
6) Native Method Stacks
Native Method stack은 Native Library에 따라 Native code의 명령어들을 가지고 있는 곳이다.자바가 아닌 다른 언어(C, C++)으로 쓰여있다.
7) Excution Engine
Execution engine은 다음을 포함한다.
- A Virtual Processor
- Interpretor: 바이트코드 스트림을 읽어 명령어를 수행함
- Just-In-Time(JIT) Compiler: 런타임 도중 성능 향상을 위해 사용되어진다.
8) Native Method interface
C, C++, Asembly와 같은 다른 언어로 작성된 다른 애플리케이션과 통신 할 수 있는 인터페이스를 제공해주는프레임워크이다.
9) Native Method Libraries
Native Libraries는 C나 C++로 쓰여진 Native Library들의 집합으로 Execution Engine의 사용을 위해 필요하다.
3. 바이트 코드란 무엇인가
자바 소스코드가 자바 컴파일러에 의해 변환된 JVM의 명령어 set을 의미한다.
4. 컴파일 하는 방법
Unix 및 DOS 셸 운영 체제의 명령 줄에서 다음과 같이 호출한다
$ javac ExampleProgram.java
JAVA VM이 이해할 수 있는 형식으로 변환시키는 과정으로써
자바 프로그램을 컴파일링하는 것은 소스 코드를 JVM이 이해할 수 있는 바이트 코드로 변환시키는 것을 의미한다.
5. 실행하는 방법
Unix 및 DOS 셸 운영 체제의 명령 줄에서 다음과 같이 호출한다
$ java ExampleProgram
Java 바이트코드로 변환 하고 나면 JVM이 내장된 모든 웹 브라우저에서 실행할 수 있게 된다.
자바 프로그램을 실행한다는 것은 JVM 바이트 코드 인터프리터를 호출하는 것을 의미한다.
바이트코드를 보기 위해선 다음의 명령어를 사용하면 된다.
$ javap -c ExampleProgram
6. JIT 컴파일러
Java기반 애플리케이션의 성능 최적화를 담당하는 Java Runtime Environment(JRE)에서 핵심적인 부분.
기본적으로 자바의 실행 방식은 바이트코드로 컴파일을 하고, 그 다음에 JVM 인터프리터에서 각각의 머신에 맞게 기계어로 변환해주는 방식인데, 이는 실행 속도가 느려지는 현상을 초래할 수 있다.
JIT 컴파일러는 속도 상승을 위해서 처음 실행 될 때 인터프리터를 통해 기계어로 번역된 자주 쏘이는 코드를 캐싱한다. 이 후에 같은 코드를 인터프리트해야 할 경우 다시 인터프리트 하는게 아닌 캐싱된 코드를 가져다 써서 반복적인 작업을 하는 오버헤드를 피해 시스템의 속도를 향상시킨다.7. JDK와 JRE의 차이
JDK(Java Development Kit)
- 자바 응용 프로그램을 만드는 소프트웨어 개발 환경
- 컴파일러, 자바 애플리케이션 런쳐, AppletViwer등을 포함한다
JRE(Java Runtime Environment)
- 다른 소프트웨어를 실행하도록 설계된 소프트웨어의 일부
- 클래스라이브러리, 로더클래스, JVM등을 포함한다.
- Java 프로그램을 실행하는 데에는 JRE가 사용되어진다.
- 클래스 라이브러리, JVM, 그 외의 지원 파일등이 포함된다. 디버거나 컴파일러 등은 포함되어 있지 않다.
References.
www.inflearn.com/course/the-java-code-manipulation/dashboard
www.javatpoint.com/jvm-java-virtual-machine
www.guru99.com/java-virtual-machine-jvm.html
en.wikipedia.org/wiki/Java_virtual_machine
www.oracle.com/java/technologies/compile.html
www.geeksforgeeks.org/just-in-time-compiler/
https://www.geeksforgeeks.org/differences-jdk-jre-jvm/