1장. JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.
목표
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.
학습할 것
JVM이란 무엇인가
JVM
는 Java Virtual Machine
의 줄임말 이며 Java Byte Code를 OS에 맞게 해석 해주는 역할을 합니다. Java의 장점 중에 하나라고 판단되는 대부분의 OS 상관 없이 구동이 가능한 것은 이 JVM이 바이트 코드를 해석하기 때문입니다. Java 파일은 바이트 코드로 변환되고 이 바이트 코드는 모든 OS에서 동일하게 해석될 수 있기 때문에 이런 장점을 가질 수 있다.
컴파일 하는 방법
javac
는 자바 컴파일러이고 자바 코드를 작성한 소스 파일(.java
)를 JVM이 인식할 수 있는 바이트 코드(.class
) 타입으로 변환시켜주는 명령어 입니다.
javac <options> <file path>
ex) javac -sourcepath:./hello.class hello.java
이렇게 만들어진 친구가 바이트 코드로 이루어진 파일이 된 것이다.
실행하는 방법
java <.class file>
ex) java hello
.class
로 만들어진 파일을 넣을 때는 뒤에 존재하는 .class
를 제거하여서 실행해야 한다.
바이트코드란 무엇인가
Bytecode, potable code, p-code
특정 하드웨어가 아닌 가상 컴퓨터에서 돌아간느 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다.
바이트 코드는 특정 하드웨어에 대한 의존성을 줄이고, 인터프리팅도 쉬운 결과물을 생성하고자 하는 프로그래밍 언어에 의해 출력 코드의 한 형태로 사용된다.
컴파일되어 만들어진 바이트코드는 특정 하드웨어의 기계 코드를 만드는 컴파일러의 입력으로 사용되거나 가상 컴퓨터에서 바로 실행된다.
JIT 컴파일러란 무엇이며 어떻게 동작하는지
JIT 컴파일러는 실행 행 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행하기도 하며, 실행 전에 프로그램 코드를 기계어로 번역한다. 실행 시점에서 인터프리트 방식으로 기계어를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
JVM 구성 요소
-
Class Loader: 모든 클래스는 참조되는 순간에 동적으로 JVM에 Link되며 메모리(Class Area)에 로딩되는데, 동적 클래스 로딩은 Class Loader을 통해서 이루어 진다.JVM은 클래스에 대한 정보를 알지 못하기때문에 그 정보를 Class Loader가 Class 파일을 찾아 검사하고 메모리에 저장해두는 것이다.
-
Execution Engine: Class Load 작업 후 , Byte Code는 Runtime Data Area에 배치된다. JVM은 Method(=Class) Area의 Byte Code를 Execution Engine에 제공하여 Class에 정의된 내용대로 실행하게 된다.즉 Execution Engine이란 ByteCode를 실행하는 Runtime Module이다. ※ Runtime Module의 방식은 Interpreter와 JIT(just in time) Compiler 방식이 있다.
-
Runtime Data Areas: 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간
JDK와 JRE의 차이
-
JRE:
Java Runtime Environment
의 약자로 자바 프로그램을 실행시켜주는 환경을 구성해주는 도구다. 즉 JAVA를 개발할 필요는 없는데, 실행은 시켜줘야 하는 경우에는 꼭 JRE가 있어야 한다. 반면 JAVA 개발시 꼭 필요한 것이 있는데 그것이 바로 JDK다. -
JDK:
Java Development Kit
의 약자로 말그대로 자바 개발시 필요한 툴킷을 제공하는 도구모음이다. 개발하려면 당연히 실행도 시켜야 하므로 JDK 안에는 JRE가 포함되어 있다.
Leave a comment